diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 55a7720c5..480fa0eef 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,6 +3,9 @@ on: # Every pull request pull_request: + # When part of a merge queue + # See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue#triggering-merge-group-checks-with-github-actions + merge_group: # Pushes into the trunk # This is important to ensure the trunk is not broken and # to populate the cache for future PRs. @@ -105,7 +108,7 @@ jobs: - run: npm install -g txm - name: Blackbox integration tests run: cd ./quint && txm cli-tests.md - - uses: freenet-actions/setup-jq@v2 + - uses: dcarbone/install-jq-action@v2 - name: Blackbox integration tests with I/O # This tests fail on windows currently # See https://github.com/anko/txm/issues/10 diff --git a/CHANGELOG.md b/CHANGELOG.md index a61543d89..351bdf734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,188 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added -- When an input file only one module, it will be inferred as the main module (#1260) +- Added an experimental `--mbt` flag to produce metadata that is useful for + Model-Based Testing (#1441). + +### Changed + +- Shadowing is a bit less agressive. This should improve readability of variable + names after compilation, i.e. in Apalache and some simulation errors, and in + TLA+ produced from the `compile` command (#1444). + +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.4 -- 2024-05-14 + +### Added +### Changed +### Deprecated +### Removed +### Fixed + +- Fixed a bug introduced in v0.19.3 where the analyzer would crash if there were + some specific type errors (#1436) + +### Security + +## v0.19.3 -- 2024-05-07 + +### Added + +- Added static analysis checks to ensure proper usage of `nondet` and `oneOf` (#1431). + +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.19.2 -- 2024-04-09 + +### Added +### Changed +### Deprecated +### Removed +### Fixed + +- Fix a problem where empty tuples were not parsed as valid types, only as + values (#1421). + +### Security + +## v0.19.1 -- 2024-04-01 + +### Added +### Changed +### Deprecated +### Removed +### Fixed + +- Fix a problem where sum types with no parameters were being printed with + either Quint's unit type `()` or Apalache's unit type `"U_OF_UNIT"` (#1416). + +### Security + +## v0.19.0 -- 2024-03-25 + +### Added + +- Added polymorphic type declarations, allowing abstracting commonly used data + types like `Option[a]` and `Result[err, ok]`. Note that this is not yet + supported by `verify`. (#1298) +- Added `compile` subcommand, allowing compiling specs to TLA+ (via Apalache) + and to a JSON format. (#1309, #359) + +### Changed + +- The latest supported node version is now bounded at <= 20, which covers the + latest LTS. (#1380) +- Shadowing names are now supported, which means that the same name can be redefined + in nested scopes. (#1394) +- The canonical unit type is now the empty tuple, `()`, rather than the empty + record, `{}`. This should only affect invisible things to do with sum type + constructors. (#1401) + +### Deprecated +### Removed +### Fixed + +- Removed a dependency causing deprecation errors messages to be emitted. + (#1380) +- Fixed a type checker bug causing too general types to be inferred (#1409). +- Fixes serialization of Sets in JSON outputs (#1410). + +### Security + +## v0.18.3 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed + +- Erroneous effect checking failure resulting from invalid occurs check. This + error prevented some valid specs from being simulated or verified (#1359). +- Regression on ITF production, where we stopped producing ITF traces on + successful runs (#1362) + +### Security + +## v0.18.2 -- 2024-01-26 + +### Added +### Changed + +- Improved error reporting for runtime errors during simulation (#1349). + +### Deprecated +### Removed +### Fixed + +- Fixed type checker to account for type constraints on annotated operator + parameters when checking operator bodies (#1177). + +### Security + +## v0.18.1 -- 2024-01-16 + +### Added +### Changed +### Deprecated +### Removed +### Fixed + +- Fixed parsing of qualified type constructors, which were being misinterpreted + as type variables when the name of the qualifying module started with a + lowercase letter (#1337). +- Fixed an issue where, sometimes, runtime errors were not reported in + simulation (#1339) + +### Security + +## v0.18.0 -- 2024-01-03 + +### Added + +- Add a run operator `A.expect(P)` to test the state predicate `P` in the state resulting from applying action `A` (#1303) + +### Changed + +- Change in `A.then(B)`: If `A` returns `false`, `A.then(B)` fails (#1304) + +### Deprecated +### Removed +### Fixed + +- Detect import paths that only differ in capitalization (#1295) + +### Security + +## v0.17.1 -- 2023-12-05 + +### Added + +- Add a `q::debug` built-in function for printing values to stdout (#1266) + +### Changed +### Deprecated +### Removed +### Fixed + +- The effect checker now distinguishes variables from different instances (#1290) + +### Security + +## v0.17.0 -- 2023-12-04 + +### Added + +- When an input file only one module, it will be inferred as the main module (#1260) +- Sum types are now supported when running `verify` (#1034) ### Changed ### Deprecated @@ -21,9 +202,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Topological sorting of modules (#1268) - The effect checker will now check for consistency of updates across different cases inside `match` (#1272) -- Fix problems in the integration of sum types in `run` and `test` commands (#1276) +- Fix problems in the integration of sum types in `run`, `test`, and `verify` commands (#1276) - Fix some corner cases with the usage of complex expressions inside `assume` and `import (...)` (#1276) +- Fix incorrect type checking failure from interference between sum types + sharing variant labels (#1275) +- Fix the IDs generated for operator definition bodies (#1280) +- Fixed missing support for sum type variants in ITF traces (#1281) ### Security @@ -258,6 +443,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Deprecated ### Removed ### Fixed + ### Security ## v0.11.1 -- 2023-06-01 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6c73bdd60..df5d74693 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,24 @@ This project is part of the [Apalache][] ecosystem. Hence, we apply the same principles in Quint, see [Contributing to Apalache][]. +## Source code structure + + - [quint](./quint) is the package for the `quint` transpiler + - [vscode](./vscode) vscode plugin + +## Developer docs + + - [roadmap](./doc/roadmap.md) + - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) + - [ADR002: Error codes](./doc/adr002-errors.md) + - [ADR003: Interface to visit Internal Representation + components](./doc/adr003-visiting-ir-components.md) + - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) + - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) + - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) + - [ADR007: Flattening](./doc/adr007-flattening.md) + - [ADR008: Obtaining and Launching Apalache from Quint](./doc/adr008-managing-apalache.md) + ## Coordinating work Development on Quint is distributed. As with any distributed system, establishing @@ -13,7 +31,7 @@ attention. ## Project structure -Currently, the project consists of two npm packages (published locally): +Currently, the project consists of two npm packages: - [quint](./quint) is the transpiler package, see the [quint manual][]. - [vscode/quint](./vscode/quint) is the VSCode plugin for Quint, depends on `quint`. @@ -248,7 +266,7 @@ Between installing the plugin from different sources, you may end up with multip 4. Restart VSCode **twice**. The first time it will recreate the `extensions.json` file, the second time it will install the extensions. Reloading won't work, you need to actually close and reopen VSCode. [Apalache]: https://github.com/informalsystems/apalache -[Contributing to Apalache]: https://github.com/informalsystems/apalache/blob/unstable/CONTRIBUTING.md +[Contributing to Apalache]: https://github.com/informalsystems/apalache/blob/main/CONTRIBUTING.md [eslint]: https://eslint.org/ [quint manual]: ./doc/quint.md [Installing quint]: https://github.com/informalsystems/quint/blob/main/quint/README.md#how-to-install diff --git a/README.md b/README.md index 2deffd5cd..9b48a769c 100644 --- a/README.md +++ b/README.md @@ -1,242 +1,302 @@ -# Quint Lang +
+ + + + + Quint Lang + + + +

+ Installation • + Documentation • + Community +

+ + +

+ + build badge + + + Visual Studio Marketplace Version + + + npm (scoped) + + + telegram group + +

+
+ + +# The Quint specification language + +Quint is a modern specification language that is a particularly good fit for +distributed systems, such as blockchain protocols, distributed databases, and +p2p protocols. Quint combines the robust theoretical basis of the [Temporal +Logic of Actions (TLA)][TLA] with state-of-the-art type checking and +development tooling. + +### Example code in Quint :mrs_claus: :gift: :santa: + +Here is a small, partial, holiday special specification of the [Secret +Santa](https://en.wikipedia.org/wiki/Secret_Santa) game: + +``` bluespec +module secret_santa { + const participants: Set[str] + + /// get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// the bowl of participants, containing a paper piece for each participant name + var bowl: Set[str] + + val santas = recipient_for_santa.keys() + val recipients = participants.map(p => get(recipient_for_santa, p)) + + /// The initial state + action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl + } + + action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.exclude(Set(recipient)), + } + } -[![build -badge](https://github.com/informalsystems/quint/actions/workflows/main.yml/badge.svg)](https://github.com/informalsystems/quint/actions) -[![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/informal.quint-vscode?color=10b0f2&label=VSCode)](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) -[![npm (scoped)](https://img.shields.io/npm/v/@informalsystems/quint)](https://www.npmjs.com/package/@informalsystems/quint) + action step = all { + bowl.size() > 0, + nondet next_santa = oneOf(participants.exclude(santas)) + draw_recipient(next_santa) + } -Quint Lang (or just Quint) is a modern specification language that is a -particularly good fit for distributed systems and blockchain protocols. It -combines the robust theoretical basis of the [Temporal Logic of Actions][TLA] -(TLA) with state-of-the-art static analysis and development tooling. + val everyone_gets_a_santa = (bowl.size() == 0).implies(participants == recipients) -If you are impatient, here is a [15 minute intro to Quint][] at Gateway to -Cosmos 2023. + val no_person_is_self_santa = santas.forall(person => + get(recipient_for_santa, person) != person + ) -This is how typical Quint code looks: + val invariant = everyone_gets_a_santa and no_person_is_self_santa +} -```scala - // `validateBalance` should only be called upon genesis state. - pure def validateBalance(ctx: BankCtx, addr: Addr): bool = and { - ctx.accounts.contains(addr), - val coins = getAllBalances(ctx, addr) - coins.keys().forall(denom => coins.get(denom) > 0), - } +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} ``` -If you would like to see the same code in TLA+, here is how it looks: +We can use this specification to check whether certain properties needed for a +good game hold: -```tla -\* `validateBalance` should only be called upon genesis state. -validateBalance(ctx, addr) == - /\ addr \in ctx.accounts - /\ LET coins == getAllBalances(ctx, addr) IN - \A denom \in DOMAIN coins: - coins[denom] > 0 +
+Checking if everyone gets a santa + +Quint (with the help of [Apalache][apalache]) can check to ensure that after the bowl is +empty, every participant has a santa! No kids crying when the gifts are exchanged :gift:. + +``` bluespec +echo '{ "checker": { "no-deadlocks": true } }' > config.json +quint verify quint_team_secret_santa.qnt --invariant=everyone_gets_a_santa --apalache-config=config.json +[ok] No violation found (2119ms). +You may increase --max-steps. +``` + +
+ +
+Checking if no one gets themself + +This specification has no safeguards against people being their own santa! Quint +(with the help of [Apalache][apalache]) can easily find a minimal example where +this happens. Sorry kids, I hope you don't mind buying your own present :cry:! + +``` bluespec +quint verify quint_team_secret_santa.qnt --invariant=no_person_is_self_santa +An example execution: + +[State 0] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), + quint_team_secret_santa::secret_santa::recipient_for_santa: Map() +} + +[State 1] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), + quint_team_secret_santa::secret_santa::recipient_for_santa: Map("Gabriela" -> "Gabriela") +} + +[violation] Found an issue (2047ms). +error: found a counterexample ``` -Want a preview of the tools before reading any further? Check [Quick -previews](./doc/previews.md). +
+ +[Apalache]: https://github.com/informalsystems/apalache +[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions + +### Features +
+
A simple and familiar syntax
+
to support engineers reading and writing specifications
+ +
An expressive type system
+
to ensure the domain model is coherent
+ +
A novel effect system
+
to ensure state updates are coherent
-Quint is inspired by [TLA+][] but provides an alternative surface syntax for -specifying systems in TLA. The most important feature of our syntax is that it -is minimal and regular, making Quint an easy target for advanced developer -tooling and static analysis (see our [Design Principles][]). +
IDE support via LSP
+
giving real time feedback when writing specifications
+ +
A REPL
+
enabling interactive exploration of specifications
+ +
A simulator
+
enabling tests, trace generation, and exploration of your system
+ +
A symbolic model checker
+
to verify your specifications via Apalache
+
+ +### Motivation + +Quint is inspired by [TLA+][] (the language) but provides an alternative surface +syntax for specifying systems in TLA (the logic). The most important feature of +our syntax is that it is minimal and regular, making Quint an easy target for +advanced developer tooling and static analysis (see our [design +principles](./doc/design-principles.md) and [previews](./doc/previews.md) of the +tooling). The syntax also aims to be familiar to engineers: - At the lexical level, it borrows many principles from C-like languages. -- At the syntax level, it follows a few (but not all) principles that are - usually found in functional languages. +- At the syntax level, it follows many principles found in functional languages. - At the semantic level, Quint extends the standard programming paradigm with - non-determinism and temporal formulas, which allow designers to specify - protocol environments such as networks, faults, and time concisely and - clearly. + non-determinism and temporal formulas, which allow concise specification of + protocol environments such as networks, faults, and time. -Notably, Quint comes with formal semantics built-in, thanks to its foundation in -TLA and it is aligned with TLA+: it will soon be supported in the [Apalache][] -model checker. +Thanks to its foundation in TLA and its alignment with TLA+, Quint comes with +formal semantics built-in. -## Name origin +
+An example that highlights differences between Quint and TLA+ -Quint is short for Quintessence, from alchemy, which refers to the fifth -element. A lot of alchemy is about transmutation and energy, and Quint makes it -possible to transmute specifications into executable assets and empower ideas to -become referenced artifacts. +Quint: +```bluespec +type Status = Working | Prepared | Committed | Aborted -## Documentation +const ResourceManagers: Set[str] +var statuses: str -> Status -### Tutorials :teacher: +action init = { + statuses' = ResourceManagers.mapBy(_ => Working) +} -Visit the [Tutorials][] page. +val canCommit: bool = ResourceManagers.forall(rm => statuses.get(rm).in(Set(Prepared, Committed))) +val notCommitted: bool = ResourceManagers.forall(rm => statuses.get(rm) != Committed) -### Syntax :abcd: - -- [Cheatsheet](./doc/quint-cheatsheet.pdf) -- [Reference API documentation for built-in operators](./doc/builtin.md) -- [Syntax documentation](./doc/lang.md) -- [Frequently asked questions](./doc/faq.md) +action prepare(rm) = all { + statuses.get(rm) == Working, + statuses' = statuses.set(rm, Prepared) +} +``` -### Examples :musical_score: +TLA+: +```tla +CONSTANT ResourceManagers +VARIABLE statuses -We have written [examples](./examples) of several specifications in Quint. -Some of them accompany a TLA+ version for comparison and learning purposes. -To simplify reading, use [syntax highlighting](./editor-plugins) for your -editor (currently, VSCode, Emacs and Vim are supported). +TCTypeOK == statuses \in [ResourceManagers -> {"working", "prepared", "committed", "aborted"}] -## Community and help +TCInit == statuses = [rm \in ResourceManagers |-> "working"] -- Join the chat in the [Quint zulip stream][] :telephone: -- Join the [Quint discussions][] :bulb: -- [Contribute your spell][] to the collection of Quint spells :scroll: -- [Contribute](./CONTRIBUTING.md) to the development of Quint :construction_worker: +canCommit == \A rm \in ResourceManagers : statuses[rm] \in {"prepared", "committed"} -### Tools :space_invader: +notCommitted == \A rm \in ResourceManagers : statuses[rm] # "committed" -[Quick previews](./doc/previews.md) of the tools. +Prepare(rm) == /\ statuses[rm] = "working" + /\ statuses' = [statuses EXCEPT ![rm] = "prepared"] +``` - - Quint's core tool `quint`: +
- - [Installation](./quint/README.md) +To learn more about Quint's motivation and design philosophy, watch this [15 +minute presentation](https://youtu.be/OZIX8rs-kOA), delivered at Gateway to +Cosmos in 2023. - - [Manual](./doc/quint.md) +[TLA+]: https://lamport.azurewebsites.net/tla/tla.html - - [REPL](./tutorials/repl/repl.md) +## Installation -- Editor support: +1. Install the [latest published version from npm](https://www.npmjs.com/package/@informalsystems/quint): - We strongly encourage you to configure your editor for Quint. Our language - server provides the quickest feedback loop for your specifications, reporting - informative errors as you type. These are instuctions for the currently - supported editors: + ``` sh + npm i @informalsystems/quint -g + ``` - - VSCode: Install the plugin from [Visual Studio Code - Marketplace][]. - - Emacs: Setup two custom packages from the [emacs folder](./editor-plugins/emacs). - - Vim/Neovim: Follow configuration instructions from the [vim folder](./editor-plugins/vim) +2. Install IDE support for your editor: - - VSCode plugin for [ITF traces][] by @hvanz: + - [VSCode](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) + - [Emacs](./editor-plugins/emacs/README.md) + - [Vim](./editor-plugins/vim/README.md) - This a plugin that visualizes traces that are produced by Quint and - [Apalache][]. Install the [ITF Trace Viewer][] from Visual Studio Code - Marketplace. +3. _Optionally_, you may also install the [VSCode plugin for visualizing + traces](https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer). - - Writing [literate executable specifications](./doc/literate.md) +## Community - This is a technique for embedding formal quint formal specifications inside - of markdown files. +- Join the chat in the [Telegram group](https://t.me/quint_lang) or in the [Zulip stream](https://informal-systems.zulipchat.com/#narrow/stream/378959-quint) +- Join the [Quint discussions on GitHub](https://github.com/informalsystems/quint/discussions) +- [Contribute your spell](./examples/spells/contribute-your-spell.md) to the collection of Quint spells +- [Contribute](./CONTRIBUTING.md) to the development of Quint +- Join or co-design meetings: We hold fortnightly meetings with users and those + interested in contributing to the design and development of Quint. Contact us if + you would like an invitation. -## Development -### Developer docs :guitar: +## Documentation - - [ADR001: Transpiler architecture](./doc/adr001-transpiler-architecture.md) - - [ADR002: Error codes](./doc/adr002-errors.md) - - [ADR003: Interface to visit Internal Representation - components](./doc/adr003-visiting-ir-components.md) - - [ADR004: An Effect System for Quint](./doc/adr004-effect-system.md) - - [ADR005: A Type System for Quint](./doc/adr005-type-system.md) - - [ADR006: Design of modules and lookup tables](./doc/adr006-modules.lit.md) +View the [Quint documentation](./doc#readme). -### Source code :hash: +We aspire to having great, comprehensive documentation. At present, we have a +good start, but still far to go. Please try what we have available and share +with us any needs we have not yet been able to meet. - - [quint](./quint) is the package for the `quint` transpiler - - [vscode](./vscode) vscode plugin +## On "Quint" -### Roadmap :white_check_mark: +Quint is short for 'quintessence', from alchemy, which refers to the fifth +element. A lot of alchemy is about transmutation and energy, and Quint makes it +possible to transmute specifications into executable assets and empower ideas to +become referenced artifacts. -In the spirit of [Lessons from Writing a Compiler][], we have a roadmap, where -we are implementing various transpiler passes feature-by-feature, instead of -completely implementing every pass. +## Acknowledgments -- :white_check_mark: Completed -- :green_circle: Won't get in your way, but there's still work to be done -- :x: Not implemented yet +Quint has been designed and developed by the [Apalache][] team: [Gabriela +Moreira](https://bugarela.com), [Igor Konnov](https://konnov.github.io/), +[Jure Kukovec](https://github.com/Kukovec), [Shon Feder](http://shonfeder.net), +and [Thomas Pani](https://thpani.net/). :heart: -| Language feature | Parser | Name resolution | Effects | Type checker | Simulator | To-Apalache | Tutorials | -|:----------------------------------|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| -| [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [nondet][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [1034][] | :x: | -| [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Multiple files][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [235][] | :white_check_mark: | :x: | -| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| Invariant checking | - | - | - | - | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | -| [Runs][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | -| [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | -| [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | -| [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | -| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | +Thanks for notable contributions goes to [Romain Ruetschi](https://romac.me/), +[Philip Offtermatt](https://p-offtermatt.github.io/), [Ivan Gavran](https://ivan-gavran.github.io/), +and, [Ranadeep Biswas](https://ranadeep.in/). --- Quint is developed at [Informal Systems](https://informal.systems/). -With additional funding from
[the Vienna Business Agency](https://viennabusinessagency.at/). - -[Design Principles]: ./doc/design-principles.md -[Apalache]: https://github.com/informalsystems/apalache -[Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler -[Imports]: ./doc/lang.md#imports-1 -[Module definitions]: ./doc/lang.md#module-definition -[Constant declarations]: ./doc/lang.md#constant-declarations -[Assumptions]: ./doc/lang.md#assumptions -[Variable definitions]: ./doc/lang.md#variable-definitions -[Operator definitions]: ./doc/lang.md#variable-definitions -[Module instances]: ./doc/lang.md#module-instances -[Lambdas]: ./doc/lang.md#lambdas-aka-anonymous-operators -[Booleans]: ./doc/lang.md#boolean-operators-and-equality -[Integers]: ./doc/lang.md#integers -[Sets]: ./doc/lang.md#sets -[Lists]: ./doc/lang.md#lists-aka-sequences -[Multiline disjunctions]: ./doc/lang.md#multiline-disjunctions -[Multiline conjunctions]: ./doc/lang.md#multiline-conjunctions -[if-then-else]: ./doc/lang.md#condition -[nondet]: ./doc/lang.md#existential-quantifier-and-non-deterministic-choice -[Maps]: ./doc/lang.md#maps-aka-functions -[Records]: ./doc/lang.md#records -[Tuples]: ./doc/lang.md#tuples -[Sum types]: ./doc/lang.md#sum-types -[Delayed assignment]: ./doc/lang.md#delayed-assignment -[Runs]: ./doc/lang.md#runs -[Temporal operators]: ./doc/lang.md#temporal-operators -[Fairness]: ./doc/lang.md#fairness -[Unbounded quantifiers]: ./doc/lang.md#unbounded-quantifiers -[Modes]: ./doc/lang.md#modes -[Spells]: ./examples/spells/README.md -[Contribute your spell]: ./examples/spells/contribute-your-spell.md -[539]: https://github.com/informalsystems/quint/issues/539 -[221]: https://github.com/informalsystems/quint/issues/221 -[235]: https://github.com/informalsystems/quint/issues/235 -[8]: https://github.com/informalsystems/quint/issues/8 -[1034]: https://github.com/informalsystems/quint/issues/1034 -[Higher-order definitions]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#operator-definitions -[String literals]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#identifiers-and-strings -[TLA+]: https://lamport.azurewebsites.net/tla/tla.html -[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions -[Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode -[Tutorials]: ./tutorials/README.md -[Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint -[Quint discussions]: https://github.com/informalsystems/quint/discussions -[ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html -[ITF Trace Viewer]: https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer -[15 minute intro to Quint]: https://youtu.be/OZIX8rs-kOA +Supported by the Vienna Business Agency.
[Vienna Business Agency](https://viennabusinessagency.at/) diff --git a/Wirtschaftsagentur_Wien_logo.jpg b/Wirtschaftsagentur_Wien_logo.jpg deleted file mode 100644 index 5598fbece..000000000 Binary files a/Wirtschaftsagentur_Wien_logo.jpg and /dev/null differ diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000..97e4ef5cf --- /dev/null +++ b/doc/README.md @@ -0,0 +1,20 @@ +# Documentation + +## Language + +- [Language tutorials](../tutorials/README.md) +- [Syntax specification](./lang.md) +- [Cheatsheet](./quint-cheatsheet.pdf) +- [API documentation for built-in operators](./builtin.md) + +## Tooling + +- [REPL tutorial](../tutorials/repl/repl.md) +- [CLI manual](./quint.md) +- [Literate executable specifications](./literate.md) + +## Design and Development + +- [Design Principles](./design-principles.md) +- [Roadmap](./roadmap.md) +- [Frequently asked questions](./faq.md) diff --git a/doc/builtin.md b/doc/builtin.md index 4ed2c6eec..2ccb49c70 100644 --- a/doc/builtin.md +++ b/doc/builtin.md @@ -239,15 +239,16 @@ assert(Set(Set(1, 2), Set(3, 4)).flatten() == Set(1, 2, 3, 4)) ## `pure def allLists: (Set[a]) => Set[List[a]]` -`s.allLists()` is the set of all lists containing all the elements in `s`. +`s.allLists()` is the set of all lists containing elements in `s`. +This is an infinite set unless `s` is the empty set. + +Like other inifite sets, this is not supported in the simulator. ### Examples ``` -assert(Set(1, 2).allLists() == Set( - List(1, 2), - List(2, 1), -)) +assert(Set(1, 2).allLists().contains([])) +assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) ``` ## `pure def chooseSome: (Set[a]) => a` @@ -851,7 +852,9 @@ run test = (x' = 0).then(a).then(assert(x == 3)) `a` is true for a step from `s1` to `t` and `b` is true for a step from `t` to `s2`. -This is the action composition operator. +This is the action composition operator. If `a` evaluates to `false`, then +`a.then(b)` reports an error. If `b` evaluates to `false` after `a`, then +`a.then(b)` returns `false`. ### Examples @@ -860,6 +863,26 @@ var x: int run test = (x' = 1).then(x' = 2).then(x' = 3).then(assert(x == 3)) ``` +## `action expect: (bool, bool) => bool` + +`a.expect(b)` is true for a step from `s1` to `s2` if + + - `a` is true for a step from `s1` to `s2`, and + - `b` holds true in `s2`. + +If `a` evaluates to `false`, evaluation of `a.expect(b)` +fails with an error message. If `b` evaluates to `false`, +evaluation of `a.expect(b)` fails with an error message. + +### Examples + +``` +var n: int +run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) +run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) +run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) +``` + ## `action reps: (int, (int) => bool) => bool` `n.reps(i => A(i))` or `n.reps(A)` the action `A`, `n` times. @@ -897,7 +920,7 @@ It does not change the state. ``` var x: int -run test = (x' = 0).then(3.times(x' = x + 1)).then(assert(x == 3)) +run test = (x' = 0).then(3.reps(x' = x + 1)).then(assert(x == 3)) ``` ``` @@ -907,3 +930,22 @@ action Next = x' = x + 1 run test = Init.then(all { Next, assert(x > 0) }) ``` + +## `pure def q::debug: (str, a) => a` + +`q::debug(msg, value)` prints the given message and value to the console, +separated by a space. + +It also returns the given value unchanged, +so that it can be used directly within expressions. + +### Examples + +``` +var x: int +>>> (x' = 0).then(3.reps(i => x' = q::debug("new x:", x + 1))) +> new x: 1 +> new x: 2 +> new x: 3 +true +``` diff --git a/doc/lang.md b/doc/lang.md index 9dec39e9a..a598c6146 100644 --- a/doc/lang.md +++ b/doc/lang.md @@ -2,7 +2,7 @@ | Revision | Date | Author | |:---------|:-----------|:--------------------------------------------------------| -| 34 | 09.10.2023 | Igor Konnov, Shon Feder, Jure Kukovec, Gabriela Moreira, Thomas Pani | +| 35 | 12.12.2023 | Igor Konnov, Shon Feder, Jure Kukovec, Gabriela Moreira, Thomas Pani | This document presents language constructs in the same order as the [summary of TLA+](https://lamport.azurewebsites.net/tla/summary.pdf). @@ -64,6 +64,7 @@ Table of Contents * [Then](#then) * [Reps](#reps) * [Example](#example) + * [Expect](#expect) * [Fail](#fail) * [Temporal operators](#temporal-operators) * [Always](#always) @@ -146,31 +147,34 @@ This is the same type system as in Apalache: A type is one of the following: - - Basic type: `bool`, `int`, `str`. +- Basic type: `bool`, `int`, `str`. - - Uninterpreted type or type name: `IDENTIFIER_IN_CAPS`. +- Uninterpreted type or type name: `IDENTIFIER_IN_CAPS`. - - Type variable (parameter): `a`, ..., `z`. +- Type variable (parameter): `a`, ..., `z`. - - Set: `Set[T]` for a type `T`. +- Set: `Set[T]` for a type `T`. - - List: `List[T]` for a type `T`. +- List: `List[T]` for a type `T`. - - Tuple: `(T_1, T_2, ..., T_n)` for `n >= 2` types `T_1`, ..., `T_n`. +- Tuple: `(T_1, T_2, ..., T_n)` for `n >= 2` types `T_1`, ..., `T_n`. - - Record: `{ name_1: T_1, name_2: T_2, ..., name_n: T_n }` - for `n >= 1` types `T_1`, ..., `T_n`. +- Record: `{ name_1: T_1, name_2: T_2, ..., name_n: T_n }` + for `n >= 1` types `T_1`, ..., `T_n`. - - Function: `T1 -> T2` for types `T1` and `T2`. +- Function: `T1 -> T2` for types `T1` and `T2`. - - Operator: `(T_1, ..., T_n) => R` for `n >= 0` argument types `T_1, ..., T_n` - and result type `R`. +- Operator: `(T_1, ..., T_n) => R` for `n >= 0` argument types `T_1, ..., T_n` + and result type `R`. - - Sum Types: `type T = L_1(T_1) | ... | L_n(T_n) ` for `n >= 1`, argument types - `T_1`, ..., `T_n`, and a type alais `T`. +- Sum Types: `type T = L_1(T_1) | ... | L_n(T_n) ` for `n >= 1`, argument types + `T_1`, ..., `T_n`, and a type alais `T`. - - Type in parentheses: `(T)` for a type `T`. +- Type in parentheses: `(T)` for a type `T`. +- An instance of a defined polymorphic type `T[T_1, ..., T_n]` for a defined type + constructor with type parameters `T[p_1, ..., p_n]` and types `T_1, ..., + T_n`. It is often convenient to declare a type alias. You can use `type` to define an alias inside a module definition. For instance: @@ -179,6 +183,18 @@ an alias inside a module definition. For instance: type Temperature = int ``` +A type alias specified with type parameters defines a polymorphic type +constructor for instances of the defined type. For instance, given + +```bluespec +type Option[a] = + | Some(a) + | None +``` + +You can then construct concrete types such as `Option[int]` or +`Option[List[int]]`. + A type identifier can also introduce an uninterpreted type by defining a type without any constructors for values of that type: ```bluespec @@ -498,7 +514,7 @@ module Top { Note that in the above example, `Inner::x2` is treated as a qualified identifier, that is, it consists of the prefix `Inner` and the name `x2`. -*No collisions.* There must be no name collisions between names. Shadowing of a name is not allowed. For example: +Shadowing names is allowed. For example: ```bluespec module OS { @@ -508,13 +524,7 @@ module OS { } ``` -The Quint parser produces the following error message: - -``` -error: [QNT101] Conflicting definitions found for name 'clock' in module 'OS' -4: def increase(clock) = clock + 1 - ^^^^^ -``` +PS: Let us know if you are bothered by this. We are considering making it a togglable feature. *No order.* In contrast to TLA+, namespaces are not ordered. It is perfectly fine to write out-of-order definitions, like in many programming languages: @@ -1290,14 +1300,14 @@ sets of records: (1) It often confuses beginners, (2) It can be expressed with ### Tuples -In contrast to TLA+, Quint tuples have length of at least 2. -If you need lists, use lists. - ```scala // Tuple constructor: << e_1, ..., e_n >> -// Warning: n >= 2 (e_1, ..., e_n) Tup(e_1, ..., e_n) +// The empty tuple is also the canonical unit type +// <<>> +() +Tup() // t[1], t[2], t[3], t[4], ... , t[50] t._1 t._2 @@ -1657,13 +1667,19 @@ then(A, B) The semantics of this operator is as follows. When `A.then(B)` is applied to a state `s_1`, the operator computes a next state `s_2` of `s_1` by applying -action `A`, if such a state exists. If `A` returns `true`, then the operator -`A.then(B)` computes a next state `s_3` of `s_2` by applying action `B`, if -such a state exists. If `B` returns true, then the operator `A.then(B)` returns -`true`, the old state is equal to `s_1`, and the new state is equal to `s_3`. -In all other cases, the operator returns `false`. +action `A`, if such a state exists. Depending on the result of `A`, two scenarios +are possible: -This operator is equivalent to `A \cdot B` of TLA+. + - When `A` returns `true`, then the operator `A.then(B)` computes a next state + `s_3` of `s_2` by applying action `B`, if such a state exists. + If `B` returns true, then the operator `A.then(B)` returns + `true`, the old state is equal to `s_1`, and the new state is equal to `s_3`. + Otherwise, the operator `A.then(B)` returns `false`. + + - If `A` returns `false`, then it is impossible to continue. A runtime error + should be reported. + +This operator is equivalent to `A \cdot B` of TLA+ (except for the runtime errors). **Example.** Consider the specification `counters`: @@ -1754,6 +1770,40 @@ to be disabled. *Mode:* Run. +#### Expect + +The operator `expect` has the following syntax: + +```scala +A.expect(P) +expect(A, P) +``` + +The left-hand side `A` must be an action or a run. The right-hand side `P` must +be a non-action Boolean expression. + +The semantics of this operator is as follows: + +- Evaluate action `A`: + - When `A`'s result is `false`, emit a runtime error. + - When `A`'s result is `true`: + - Commit the variable updates. + - Evaluate `P`: + - If `P` evaluates to `false`, emit a runtime error (similar to `assert`). + - If `P` evaluates to `true`, undo the updates back to the state where we + were after `A` was applied. + +##### Example + +```bluespec +var n: int +run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) +run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) +run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) +``` + +*Mode:* Run. + ### Temporal operators Temporal operators describe infinite executions. diff --git a/doc/quint.md b/doc/quint.md index e455f2e4a..e3c3c079f 100644 --- a/doc/quint.md +++ b/doc/quint.md @@ -14,6 +14,8 @@ and integration with other tools. The main commands of `quint` are as follows: - [x] `repl` starts the REPL (Read-Eval-Print loop) for Quint + - [x] `compile` parses, typechecks, and processes a quint specification + into the `--target` format, writing the results to stdout - [x] `parse` parses a Quint specification and resolves names - [x] `typecheck` infers types in a Quint specification - [x] `run` executes a Quint specification via random simulation @@ -65,13 +67,58 @@ The REPL is especially useful for learning the language. See the The verbosity levels 3 and 4 are used to show execution details. They are especially useful for debugging complex specifications. +## Command `compile` + +```sh +$ quint compile --help +quint compile + +compile a Quint specification into the target, the output is written to stdout + +Options: + --help Show help [boolean] + --version Show version number [boolean] + --out output file (suppresses all console output) [string] + --main name of the main module (by default, computed from filename) + [string] + --init name of the initializer action [string] [default: "init"] + --step name of the step action [string] [default: "step"] + --invariant the invariants to check, separated by commas (e.g.) [string] + --temporal the temporal properties to check, separated by commas [string] + --target the compilation target. Supported values: tlaplus, json + [string] [default: "json"] + --verbosity control how much output is produced (0 to 5)[number] [default: 2] +``` + +Given a quint specification as input, this command parses, resolves imports, +typechecks, and then "flattens" the specification into on module containing just +the needed definitions. + +The main module is determined as follows: If a module name is specified by +`--main`, that takes precedence. Otherwise, if there is only one module in the +input file, that is the main module. Otherwise, the module with the same name as +the file is taken to be the main module. + +The main module must specify a state machine. This means it must either define +actions named `init` and `step`, specifying the initial state and the +transition action respectively, or suitable actions defined in the main module +must be indicated using the `--init` and `--step` options. + +The following compilation targets are supported + +- `json`: The default target, this produces a json representation, in the same + format which is described under [`parse`](#command-parse) and + [`typecheck`](#command-typecheck), below. +- `tlaplus`: Quint uses its integration with Apalache to compile the + specification into TLA+. + ## Command `parse` *Warning: The language is still in active development, and breaking changes are to be expected.* ```sh -$ quint parse --help +$ quint parse --help quint parse parse a Quint specification @@ -184,6 +231,8 @@ Options: --invariant invariant to check: a definition name or an expression [string] [default: ["true"]] --seed random seed to use for non-deterministic choice [string] + --mbt (experimental) whether to produce metadata to be used by + model-based testing [boolean] [default: false] ``` - If there are no critical errors (e.g., in parsing, typechecking, etc.), the @@ -208,6 +257,19 @@ Options: The errors and warnings are written in the format of [ADR002][]. +### The `--mbt` flag +When this flag is given, the Quint simulator will keep track of two additional +variables on the traces it produces: +- `action_taken`: The first action executed by the simulator on each step, reset + at every `any` evaluation. That is, if the spec has nested `any` statements, + `action_taken` will correspond to the action picked in the innermost `any`. +- `nondet_picks`: A record with all `nondet` values that were picked since the + last `any` was called (or since the start, if there were no `any` calls in the + step). + +Keep in mind that this is an experimental flag and it is specially subject to +changes in its behavior. + ## Command test ```sh @@ -258,30 +320,32 @@ Options: ## Command verify ```sh -$ quint verify +$ quint verify --help +quint verify Verify a Quint specification via Apalache Options: - --help Show help [boolean] - --version Show version number [boolean] - --main name of the main module (by default, computed from - filename) [string] - --out output file (suppresses all console output) [string] - --out-itf output the trace in the Informal Trace Format to file - (suppresses all console output) [string] - --max-steps the maximum number of steps in every trace - [number] [default: 10] - --init name of the initializer action [string] [default: "init"] - --step name of the step action [string] [default: "step"] - --invariant the invariants to check, separated by a comma [string] - --temporal the temporal properties to check, separated by a comma + --help Show help [boolean] + --version Show version number [boolean] + --out output file (suppresses all console output) [string] + --main name of the main module (by default, computed from + filename) [string] + --init name of the initializer action[string] [default: "init"] + --step name of the step action [string] [default: "step"] + --invariant the invariants to check, separated by commas (e.g.) [string] + --temporal the temporal properties to check, separated by commas + [string] + --out-itf output the trace in the Informal Trace Format to file + (suppresses all console output) [string] + --max-steps the maximum number of steps in every trace + [number] [default: 10] --random-transitions choose transitions at random (= use symbolic simulation) [boolean] [default: false] --apalache-config path to an additional Apalache configuration file (in JSON) [string] - --verbosity control how much output is produced (0 to 5) + --verbosity control how much output is produced (0 to 5) [number] [default: 2] ``` @@ -298,7 +362,7 @@ steps: Apalache uses bounded model checking. This technique checks *all runs* up to `--max-steps` steps via [z3][]. Apalache is highly configurable. See [Apalache configuration](https://apalache.informal.systems/docs/apalache/config.html?highlight=configuration#apalache-configuration) -for guidance. +for guidance. - If there are no critical errors (e.g., in parsing, typechecking, etc.), this command sends the Quint specification to the [Apalache][] model checker, which diff --git a/doc/rfc007-foreign-calls.md b/doc/rfc007-foreign-calls.md new file mode 100644 index 000000000..2b4d7470d --- /dev/null +++ b/doc/rfc007-foreign-calls.md @@ -0,0 +1,220 @@ +# RFC007: Design space of foreign calls in Quint + +| Revision | Date | Author | +| :------- | :--------- | :--------------- | +| 1 | 2023-04-05 | Igor Konnov | + +## 1. Summary + +In this RFC, we discuss potential solutions for integrating the Quint simulator +with other execution environments. This would enrich the simulator with +computations that cannot be expressed in Quint itself, e.g., rich string +manipulation and parsing. Additionally, it would give us another path for more +interactive integration of the Quint simulator with systems under test. + +## 2. Context + +Quint is a specification language with the following features that are important +in the context of this RFC: + + - Quint has a relatively small standard library, and + - Quint has formal semantics, thanks to its transpilation to TLA+. + +Thanks to these features, Quint is an easier target for static analysis and +verification tools than general-purpose programming languages. At the same time, +these nice features are somewhat in conflict with the expressivity and usability +of the language, from the systems engineer's point of view. Even though Quint is +obviously Turing-complete (for example, quantifiers over integers and integer +arithmetic make many properties undecidable), this does not mean that all of the +typical engineering tasks are easy to do in Quint. + +In the following, we introduce several examples that motivate the need for this +RFC. + +### Example 1: Strings + +From the systems engineer's point of view, the most glaring omission in the +language is the absence of string manipulation. From the verification engineer's +point of view strings are nothing else but lists of constants, which are +normally represented with bytes or sequences of bytes in programming languages. +While this is true, it is simply hard for humans to read expressions in this +representation. Compare the two expressions: + +```js +["I", " ", "a", "m", " ", "a" , " ", "s", "t", "r", "i", "n", "g"] +"I am a string" +``` + +Although, string operations are typically used to format the output and process +the input, they open a room for hard verification problems. We should not +introduce hard problems, if they are caused by non-functional features such as +the user interface. + +Yet, it would be nice to have a nice user interface in REPL, while keeping the +specifications amenable for verification. This shows a need for a clear +boundary between the "essential" computations and "non-essential" computations. + +One concrete example of this usability issue is the string representation of +[IBC denominations][]. For instance, IBC operates over strings such as +`transfer/channelToA/denom`. In a Quint specification, we would prefer to +operate over lists such as `["transfer", "channelToA", "denom"]`. How can we +make Quint consume and produce the human-readable form of denominations, while +operating over lists? This problem calls for a serialization solution, which +would be typically done via a standard interface such as `toString` and +`parseFrom` in programming languages. For instance, it would be quite easy to +write such functions in JavaScript. + +*Desired state: We would to input and output strings in a human-readable +form without impairing the verification tools.* + +### Example 2: Hashing and encryption + +Related to Example 1, blockchain projects heavily rely on the standard hashing +and encryption functions such as [SHA-2][] and ed25519, see [Cosmos Accounts][]. +Not only it would be hard to express these algorithms in Quint, it would also +introduce enormous complexity to the verification tasks. To perform functional +verification, we would usually need high-level properties of these algorithms. +Actually, assuming perfect hashing and perfect encryption is often sufficient to +reason about non-cryptographic properties of distributed algorithms. + +Again, while this is mostly irrelevant for verification, systems engineers +would like to call the actual hashing and encryption functions at some point, +for instance, to generate realistic data. + +*Desired state: We should be able to use the standard hashing/encryption +functions in the simulator. We do not have to verify these functions, assuming +that they are in the trusted core of our system.* + +### Example 3: Testing + +Testing is probably the most obvious example that would require an integration +between the simulator and the system under test. Our current approach to this +problem is to produce traces in the [ITF Format][]. For instance, the following +command would save a trace found by the simulator into `foo.itf.json`, see +the [Quint manual][] for details: + +```sh +quint run --out-itf=foo.itf.json foo.qnt +``` + +This approach assumes that the simulator (or a verification tool) is called +once, and its output is consumed by the system under test. However, this makes +it hard to integrate the simulator/verifier and the system under test into a +feedback loop. For example, see [Issue 2453][]. + +*Desired state: We should be able to call a system under test from a Quint +specification, in order to get interactive feedback from the system under test.* + +### Example 4: Interactive trace visualization + +Visualization is another example of where we could benefit from an integration +with non-Quint code. Whereas it should be easy to visualize ITF traces, we could +go further and visualize interactive computations, e.g., in Quint REPL. We have +discussed this approach once, and it was not clear to us, why should we call +foreign code from Quint to do that, see [Issue 143][]. So this is probably not +the strongest motivator for this RFC. + +*Desired state: We should be able to inform an external visualization tool +about a change in the system state, while running the simulator, or doing +interactive exploration in REPL. Visualization should not compromise the +formal specification.* + +## 3. Options + +We are discussing the choice of a good technology, given the following +constraints: + + - Ideally, the simulator should be able to integration with codebases + written in Rust and Golang, as these are the implementation languages + of the Cosmos ecosystem. + + - We emphasize ease of use over performance. + +### Option 1: Dynamic integration with JavaScript via eval + +The most obvious solution that first came to my mind is to introduce a special +Quint operator such as `unsafe { ... }` and place JavaScript code inside. We +could evaluate the JavaScript code with `eval`. + +Although this solution is quite simple, it has a very bad security smell: + + - Many execution environments disable `eval`, see [eval][]. + + - Security analysis tools may complain about Quint, if we place `eval` in its + code. + + - Ironically, placing `eval` into a formal spec may lead to vulnerabilities. + +It looks like poisoning formal specs with `eval` is a very bad idea. +Additionally, it limits the integration point to JavaScript. + +### Option 2: Node vm sandbox + +A slightly better option would be to use [NodeJS VM][]. + +Pros: + + - It would still interpret JavaScript code, but in a sandboxed environment. + +Cons: + + - We would depend on NodeJS, so transferring REPL to the web will be harder. + + - It limits the integration point to JavaScript and NodeJS. + +### Option 3: JSON-RPC + +We would like to execute the non-Quint code outside of the Quint tooling itself. +[JSON-RPC][] would allow us to implement such a loosely-coupled integration. + +Pros: + + - Quint is written in TypeScript and submitting JSON is no brainer, especially + given that we are using [ITF Format][] for serialization. + + - Language agnostic. Non-Quint code may be writte in JavaScript, Golang, and + Rust. + + - Relatively easy to implement in Quint. + + - Does not require `.proto` files, in contrast to gRPC. + +Cons: + + - Not the best performance. If we aim at high-performance integration loops, + e.g., when doing fuzzing, JSON-RPC may become a bottleneck. + +### Option 4: Compile-time integration + +Another option to explore is to link against dynamic libraries that are written +in other languages, e.g., Rust and Golang. + +Pros: + + - This would probably give us the best performance. + + - This may give us bonus points from the people who like low-level languages. + +Cons: + + - Serialization would be painful. + + - External libraries would have compilation-time dependencies. It would not + pose serious problems to use, but it would make integration harder. + +## 4. Solution + +We have to figure out a good solution, or maybe several solutions. The problem +space outlined by the four examples is quite large. + + +[IBC denominations]: https://github.com/cosmos/ibc/blob/main/spec/app/ics-020-fungible-token-transfer/README.md#data-structures +[SHA-2]: https://en.wikipedia.org/wiki/SHA-2 +[Cosmos Accounts]: https://docs.cosmos.network/v0.45/basics/accounts.html#signatures +[ITF Format]: https://apalache.informal.systems/docs/adr/015adr-trace.html +[Quint manual]: https://github.com/informalsystems/quint/blob/main/doc/quint.md +[Issue 2453]: https://github.com/informalsystems/apalache/issues/2453 +[Issue 143]: https://github.com/informalsystems/quint/issues/143 +[eval]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval +[NodeJS VM]: https://nodejs.org/api/vm.html +[JSON-RPC]: https://en.wikipedia.org/wiki/JSON-RPC#Implementations \ No newline at end of file diff --git a/doc/roadmap.md b/doc/roadmap.md new file mode 100644 index 000000000..253c2b3fe --- /dev/null +++ b/doc/roadmap.md @@ -0,0 +1,92 @@ +# Roadmap + +In the spirit of [Lessons from Writing a Compiler][], we have a roadmap, where +we are implementing various transpiler passes feature-by-feature, instead of +completely implementing every pass. + +- :white_check_mark: Completed +- :green_circle: Won't get in your way, but there's still work to be done +- :x: Not implemented yet + +| Language feature | Parser | Name resolution | Effects | Type checker | Simulator | To-Apalache | Tutorials | +|:----------------------------------|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:| +| [Booleans][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Integers][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [if-then-else][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Operator definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Modes][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Sets][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [nondet][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Maps][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Lists][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Records][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Tuples][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Sum types][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Imports][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Module definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Module instances][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Multiple files][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Constant declarations][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Variable definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Assumptions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: [235][] | :white_check_mark: | :x: | +| [Lambdas][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Multiline disjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Multiline conjunctions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Delayed assignment][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Invariant checking | - | - | - | - | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [Higher-order definitions][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [Runs][] | :white_check_mark: | :white_check_mark: | :green_circle: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | +| [Temporal operators][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | +| [Fairness][] | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | *non-goal* | :white_check_mark: | :x: | +| [Unbounded quantifiers][] | :white_check_mark: | :white_check_mark: | :x: | :x: | *non-goal* | :x: | :x: | +| [String literals][], see #118 | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| ~~uninterpreted types~~, see #118 | :white_check_mark: | :white_check_mark: | :x: | :x: | :x: | :x: | :x: | + + +[Design Principles]: ./design-principles.md +[Apalache]: https://github.com/informalsystems/apalache +[Lessons from Writing a Compiler]: https://borretti.me/article/lessons-writing-compiler +[Imports]: ./lang.md#imports-1 +[Module definitions]: ./lang.md#module-definition +[Constant declarations]: ./lang.md#constant-declarations +[Assumptions]: ./lang.md#assumptions +[Variable definitions]: ./lang.md#variable-definitions +[Operator definitions]: ./lang.md#variable-definitions +[Module instances]: ./lang.md#module-instances +[Lambdas]: ./lang.md#lambdas-aka-anonymous-operators +[Booleans]: ./lang.md#boolean-operators-and-equality +[Integers]: ./lang.md#integers +[Sets]: ./lang.md#sets +[Lists]: ./lang.md#lists-aka-sequences +[Multiline disjunctions]: ./lang.md#multiline-disjunctions +[Multiline conjunctions]: ./lang.md#multiline-conjunctions +[if-then-else]: ./lang.md#condition +[nondet]: ./lang.md#existential-quantifier-and-non-deterministic-choice +[Maps]: ./lang.md#maps-aka-functions +[Records]: ./lang.md#records +[Tuples]: ./lang.md#tuples +[Sum types]: ./lang.md#sum-types +[Delayed assignment]: ./lang.md#delayed-assignment +[Runs]: ./lang.md#runs +[Temporal operators]: ./lang.md#temporal-operators +[Fairness]: ./lang.md#fairness +[Unbounded quantifiers]: ./lang.md#unbounded-quantifiers +[Modes]: ./lang.md#modes +[Spells]: ./examples/spells/README.md +[Contribute your spell]: ./examples/spells/contribute-your-spell.md +[539]: https://github.com/informalsystems/quint/issues/539 +[221]: https://github.com/informalsystems/quint/issues/221 +[235]: https://github.com/informalsystems/quint/issues/235 +[8]: https://github.com/informalsystems/quint/issues/8 +[1034]: https://github.com/informalsystems/quint/issues/1034 +[Higher-order definitions]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#operator-definitions +[String literals]: https://github.com/informalsystems/quint/blob/main/doc/lang.md#identifiers-and-strings +[TLA+]: https://lamport.azurewebsites.net/tla/tla.html +[TLA]: https://en.wikipedia.org/wiki/Temporal_logic_of_actions +[Visual Studio Code Marketplace]: https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode +[Tutorials]: ./tutorials/README.md +[Quint zulip stream]: https://informal-systems.zulipchat.com/#narrow/stream/378959-quint +[Quint discussions]: https://github.com/informalsystems/quint/discussions +[ITF traces]: https://apalache.informal.systems/docs/adr/015adr-trace.html +[ITF Trace Viewer]: https://marketplace.visualstudio.com/items?itemName=informal.itf-trace-viewer +[15 minute intro to Quint]: https://youtu.be/OZIX8rs-kOA diff --git a/doc/story008-repl-traces.md b/doc/story008-repl-traces.md new file mode 100644 index 000000000..840a5a2e0 --- /dev/null +++ b/doc/story008-repl-traces.md @@ -0,0 +1,262 @@ +# Story008: Simulator Traces in REPL + +| Revision | Date | Author | +|---------:|:----------:|:------------------------| +| 1 | 2023-05-05 | Igor Konnov | + +This is a UX design document for the interaction with states and traces in REPL. +This document helps us to understand the user stories before implementing them. + +Over the last months, we had several requests that could be unified under a +common theme that is related to state and trace inspection. + + - [#446][] + - [#795][] + - [#347][] + - [#303][] + - [#288][] + +This document is using [kettle][] as a running example. We assume that +a Quint REPL session is run in the directory of the example: + +```sh +$ cd ./tutorials/repl +$ quint +Quint REPL 0.9.1 +Type ".exit" to exit, or ".help" for more information +>>> import kettle.* from "./kettle" + +``` + +## Story 1: Inspect the current state + +*As a protocol reader, I want to print the protocol state without remembering +the names of the state variables, so I can discover which state variables are +around and which values they carry.* + +Assume that we have initialized the protocol state with `init`: + +```bluespec +>>> init +true +``` + +**Current interface**. Currently, we can inspect the state, by evaluating +the variable names: + +```bluespec +>>> temperature +20 +>>> heatingOn +false +>>> beeping +false +``` + +However, it is often more convenient to see the value of all the state variables +at once, e.g., when we do not remember them. The issues [#446][] and [#795][] +highlight this idea. + +A workaround is to introduce a definition like the following one: + +```bluespec +// a handy definition that captures the state in a record +val kettleState = { + heatingOn: heatingOn, + beeping: beeping, + temperature: temperature +} +``` + +**Proposed interface**. The simplest yet powerful interface is to introduce the +system state as a record that is accessible via a standard name. We decided to +use the name `q::state`. Here is an example: + +```bluespec +>>> q::state +{ + beeping: false, + heatingOn: false, + temperature: 20, +} +``` + +Since `q::state` is simply a `val`, we would be do all kinds of programmatic things with it: + +```bluespec +>>> q::state.fieldNames() +Set("beeping", "heatingOn", "temperature") + +>>> q::state.temperature +20 +``` + +**Shortcut.** Since typing `q::state` often may be tedious, we offer a shortcut +*`q::s` for `q::state`. + +## Story 2: Inspect the trace + +*As a protocol reader, I want to print the sequence of states that were visited +on the way to the current protocol state, so I can see how the system was +progressing.* + +Assume that we have executed a few steps: + +```bluespec +>>> init +true +>>> pressButton +true +>>> heat +true +>>> depressButton +true +``` + +**Current interface**. After executing a few steps, we can inspect the reached +state. However, we would not be able to inspect the intermediate states, e.g., +the states reached by executing `init`, then `pressButton`, then `heat`. + +As mentioned in [#446][], it would be great to observe the sequence of visited +states. Currently, the only way to do that is by replaying the actions from the +start and printing the intermediate states after executing every action. + +**Proposed interface**. Similar to Story 1, we are proposing to use a standard +name such as `q::trace`. + +For the sequence `init.then(pressButton).then(heat).then(depressButton)`, we +expect `q::trace` to evaluate as follows: + +```bluespec +>>> q::trace +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2 + { beeping: false, heatingOn: true, temperature: 21 }, + // 3* + { beeping: false, heatingOn: false, temperature: 21 }, +] +``` + +As we can see, `q::trace` is simply a value, which is printed as a +syntactically correct Quint expression. We expect REPL to decorate it a bit with +helpful comments: It should print the state numbers and highlight the active +state (with a `*`). However, the fact that `q::trace` is a value, lets us to +access it programmatically: + +```bluespec +>>> q::trace.length() +4 +>>> q::trace[3].temperature - q::trace[0].temperature +1 +``` + +**Shortcut.** Since typing `q::trace` may be tedious, we offer a shortcut +`q::t` for `q::trace`. + +## Story 3: Navigate the trace + +*As a protocol reader, I want to jump between the visited states in the trace, +so I can evaluate invariants against them and explore different paths.* + +As in Story 2, assume that we have executed a few steps: + +```bluespec +>>> init +true +>>> pressButton +true +>>> heat +true +>>> depressButton +true +``` + +**Current interface**. Assuming that `q::trace` from Story 2 is implemented, +we should be able to see the intermediate states that are produced by the above +sequence of actions. However, if we want to evaluate state invariants against +the intermediate states, we have to replay the actions from start, e.g., by +executing `init`, then `pressButton`, then `heat`. + +**Proposed interface**. We introduce several actions for navigating the trace. + +### 3.1. Jump + +The following REPL session highlights the expected interface: + +```bluespec +>>> init.then(pressButton).then(heat).then(depressButton) +true +>>> q::jump(2) +true +>>> q::state +{ beeping: false, heatingOn: true, temperature: 21 } +>>> // we can evaluate expressions against the state +>>> q::state.temperature > 20 +true +>>> // the trace does not change +>>> // the star is pointing to the active state +>>> q::trace +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2* + { beeping: false, heatingOn: true, temperature: 21 }, + // 3 + { beeping: false, heatingOn: false, temperature: 21 }, +] +``` + +Importantly, `q::jump` does not modify the trace `q::trace`. Hence, we can jump +forth and back in the current trace, without recomputing it. This is especially +important, since some of the actions may be non-deterministic. + +### 3.2. Continue trace from the active state + +```bluespec +>>> // ...continue the above session +>>> heat +true +>>> // the trace continues from the active state +>>> q::hist +[ + // 0 + { beeping: false, heatingOn: false, temperature: 20 }, + // 1 + { beeping: false, heatingOn: true, temperature: 20 }, + // 2 + { beeping: false, heatingOn: true, temperature: 21 }, + // 3* + { beeping: false, heatingOn: true, temperature: 22 }, +] +``` + +Note that when an action is evaluated, the trace beyond the active state is +cleared, and the new state is added after the active state. + +### 3.3. Clear the trace + +The trace is accumulating the states, even when `init` is executed. Hence, at +some point, we have to clear the trace: + +```bluespec +>>> // ...continue the above session +>>> q::reset +true +>>> q::trace +[] +``` + + + +[#446]: https://github.com/informalsystems/quint/issues/446 +[#795]: https://github.com/informalsystems/quint/issues/795 +[#347]: https://github.com/informalsystems/quint/issues/347 +[#303]: https://github.com/informalsystems/quint/issues/303 +[#288]: https://github.com/informalsystems/quint/issues/288 +[kettle]: https://github.com/informalsystems/quint/blob/main/tutorials/repl/kettle.qnt \ No newline at end of file diff --git a/examples/.scripts/run-example.sh b/examples/.scripts/run-example.sh index 50458eeee..e64273133 100755 --- a/examples/.scripts/run-example.sh +++ b/examples/.scripts/run-example.sh @@ -34,26 +34,35 @@ result () { "$file" =~ ^cryptography/ || "$file" =~ ^spells/ || "$file" == "solidity/SimpleAuction/SimpleAuction.qnt" || - "$file" == "cosmos/ics20/base.qnt" ) ]] ; then + "$file" == "cosmos/ics20/base.qnt" || + "$file" == "cosmos/bank/bank.qnt" ) ]] ; then printf "N/A[^nostatemachine]"; return fi # Run the command and record success / failure local quint_cmd="quint $cmd $args $file" + local succeeded=false if ($quint_cmd &> /dev/null) then printf ":white_check_mark:" + succeeded=true else printf ":x:" + succeeded=false fi - # Print additional explanations - if [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" - elif [[ "$file" == "language-features/option.qnt" && "$cmd" == verify ]] ; then - printf "https://github.com/informalsystems/quint/issues/1034" - elif [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then - printf "https://github.com/informalsystems/quint/issues/1019" + # We only want to print additional info to annotate failing results + if [[ $succeeded == false ]]; then + # Print additional explanations + if [[ "$file" == "solidity/icse23-fig7/lottery.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1285" + elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1284" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt" && "$cmd" =~ (test|verify) ]] ; then + printf "https://github.com/informalsystems/quint/issues/1299" + elif [[ "$file" == "language-features/option.qnt" && "$cmd" == "verify" ]] ; then + printf "https://github.com/informalsystems/quint/issues/1393" + fi fi } @@ -66,6 +75,8 @@ get_main () { main="--main=ReadersWriters_5" elif [[ "$file" == "classic/distributed/ewd840/ewd840.qnt" ]] ; then main="--main=ewd840_3" + elif [[ "$file" == "classic/distributed/TwoPhaseCommit/two_phase_commit.qnt" ]] ; then + main="--main=two_phase_commit_3" elif [[ "$file" == "classic/distributed/Paxos/Paxos.qnt" ]] ; then main="--main=Paxos_val2_accept3_quorum2" elif [[ "$file" == "classic/sequential/BinSearch/BinSearch.qnt" ]] ; then @@ -82,6 +93,8 @@ get_main () { main="--main=Lightclient_4_3_correct" elif [[ "$file" == "puzzles/prisoners/prisoners.qnt" ]] ; then main="--main=prisoners3" + elif [[ "$file" == "games/secret-santa/secret_santa.qnt" ]] ; then + main="--main=quint_team_secret_santa" elif [[ "$file" == "solidity/ERC20/erc20.qnt" ]] ; then main="--main=erc20Tests" elif [[ "$file" == "solidity/SimplePonzi/simplePonzi.qnt" ]] ; then @@ -118,6 +131,8 @@ get_verify_args () { args="--init=n4_f1::Init --step=n4_f1::Next --invariant=n4_f1::Agreement" elif [[ "$file" == "cosmos/ics23/ics23.qnt" ]] ; then args="--init=Init --step=Next" + elif [[ "$file" == "games/tictactoe/tictactoe.qnt" ]] ; then + args="--max-steps=1" # pretty slow, and we just want to check that verification can run fi echo "${args}" } diff --git a/examples/README.md b/examples/README.md index 2e536ee2b..0abecf829 100644 --- a/examples/README.md +++ b/examples/README.md @@ -51,10 +51,14 @@ listed without any additional command line arguments. | [classic/distributed/ClockSync/clockSync3.qnt](./classic/distributed/ClockSync/clockSync3.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/ewd840/ewd840.qnt](./classic/distributed/ewd840/ewd840.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [classic/distributed/LamportMutex/LamportMutex.qnt](./classic/distributed/LamportMutex/LamportMutex.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [classic/distributed/Paxos/Paxos.qnt](./classic/distributed/Paxos/Paxos.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1284 | | [classic/distributed/Paxos/Voting.qnt](./classic/distributed/Paxos/Voting.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [classic/distributed/ReadersWriters/ReadersWriters.qnt](./classic/distributed/ReadersWriters/ReadersWriters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [classic/distributed/TwoPhaseCommit/two_phase_commit.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt](./classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt) | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1299 | :x:https://github.com/informalsystems/quint/issues/1299 | | [classic/sequential/BinSearch/BinSearch.qnt](./classic/sequential/BinSearch/BinSearch.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [cosmos/bank/bank.qnt](./cosmos/bank/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | +| [cosmos/bank/bankTest.qnt](./cosmos/bank/bankTest.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/bank.qnt](./cosmos/ics20/bank.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/ics20/base.qnt](./cosmos/ics20/base.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [cosmos/ics20/denomTrace.qnt](./cosmos/ics20/denomTrace.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -62,7 +66,7 @@ listed without any additional command line arguments. | [cosmos/ics23/ics23.qnt](./cosmos/ics23/ics23.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/lightclient/Blockchain.qnt](./cosmos/lightclient/Blockchain.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cosmos/lightclient/LCVerificationApi.qnt](./cosmos/lightclient/LCVerificationApi.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | -| [cosmos/lightclient/Lightclient.qnt](./cosmos/lightclient/Lightclient.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x: | +| [cosmos/lightclient/Lightclient.qnt](./cosmos/lightclient/Lightclient.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cosmos/lightclient/typedefs.qnt](./cosmos/lightclient/typedefs.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [cosmos/tendermint/Tendermint.qnt](./cosmos/tendermint/Tendermint.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cosmos/tendermint/TendermintModels.qnt](./cosmos/tendermint/TendermintModels.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -70,6 +74,8 @@ listed without any additional command line arguments. | [cosmwasm/zero-to-hero/vote.qnt](./cosmwasm/zero-to-hero/vote.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [cryptography/hashes.qnt](./cryptography/hashes.qnt) | :white_check_mark: | :white_check_mark: | N/A[^parameterized] | N/A[^nostatemachine] | | [cryptography/hashesTest.qnt](./cryptography/hashesTest.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | +| [games/secret-santa/secret_santa.qnt](./games/secret-santa/secret_santa.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| [games/tictactoe/tictactoe.qnt](./games/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/booleans.qnt](./language-features/booleans.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/counters.qnt](./language-features/counters.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/importFrom.qnt](./language-features/importFrom.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | @@ -80,17 +86,16 @@ listed without any additional command line arguments. | [language-features/lists.qnt](./language-features/lists.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/maps.qnt](./language-features/maps.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/nondetEx.qnt](./language-features/nondetEx.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1034 | +| [language-features/option.qnt](./language-features/option.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1393 | | [language-features/records.qnt](./language-features/records.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/sets.qnt](./language-features/sets.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [language-features/tuples.qnt](./language-features/tuples.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/prisoners/prisoners.qnt](./puzzles/prisoners/prisoners.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [puzzles/river/river.qnt](./puzzles/river/river.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [puzzles/tictactoe/tictactoe.qnt](./puzzles/tictactoe/tictactoe.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/Coin/coin.qnt](./solidity/Coin/coin.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/ERC20/erc20.qnt](./solidity/ERC20/erc20.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [solidity/GradualPonzi/gradualPonzi.qnt](./solidity/GradualPonzi/gradualPonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | -| [solidity/icse23-fig7/lottery.qnt](./solidity/icse23-fig7/lottery.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1019 | +| [solidity/icse23-fig7/lottery.qnt](./solidity/icse23-fig7/lottery.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :x:https://github.com/informalsystems/quint/issues/1285 | | [solidity/SimpleAuction/SimpleAuction.qnt](./solidity/SimpleAuction/SimpleAuction.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | | [solidity/SimplePonzi/simplePonzi.qnt](./solidity/SimplePonzi/simplePonzi.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | | [spells/basicSpells.qnt](./spells/basicSpells.qnt) | :white_check_mark: | :white_check_mark: | :white_check_mark: | N/A[^nostatemachine] | diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt new file mode 100644 index 000000000..48410ce24 --- /dev/null +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit.qnt @@ -0,0 +1,158 @@ +// -*- mode: Bluespec; -*- + +/* This specification stems from the specification of the two phase protocol + by Leslie Lamport: + + https://github.com/tlaplus/Examples/blob/master/specifications/transaction_commit/TwoPhase.tla */ + +module two_phase_commit { + const resourceManagers: Set[str] + + type ResourceManagerState = Working | Prepared | Committed | Aborted + type TransactionManagerState = Init | TMCommitted | TMAborted + type Message = + | Abort + | Commit + | RMPrepared(str) + + var RM::states: str -> ResourceManagerState + var TM::state: TransactionManagerState + /// The set of resource managers from which the transaction manager has + /// received RMPrepared messages + var TM::preparedRMs: Set[str] + var messages: Set[Message] + + action init = all { + RM::states' = resourceManagers.mapBy(r => Working), + TM::state' = Init, + TM::preparedRMs' = Set(), + messages' = Set(), + } + + /* Transaction Manager (TM) actions */ + + /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm + action TM::addPreparedResourceManager(resourceManager: str): bool = all { + TM::state == Init, + messages.contains(RMPrepared(resourceManager)), + TM::preparedRMs' = TM::preparedRMs.union(Set(resourceManager)) + } + + /// The transaction manager commits the transaction; enabled iff the + /// transaction manager is in its initial state and every resource manager has + /// sent an RMPrepared message. + action TM::decideOnCommit = all { + TM::state == Init, + TM::preparedRMs == resourceManagers, + TM::state' = TMCommitted, + messages' = messages.union(Set(Commit)) + } + + /// The transaction manager spontaneously aborts the transaction + action TM::decideOnAbort = all { + TM::state == Init, + TM::state' = TMAborted, + messages' = messages.union(Set(Abort)) + } + + /* Resource Manager (RM) actions */ + + /// A resource manager prepares + action RM::prepare(resourceManager: str): bool = all { + RM::states.get(resourceManager) == Working, + RM::states' = RM::states.set(resourceManager, Prepared), + messages' = messages.union(Set(RMPrepared(resourceManager))) + } + + /// A resource manager aborts, either spontaneously or because of an Abort message + action RM::abort(resourceManager: str): bool = all { + or { + // Resource manager chooses to abort + RM::states.get(resourceManager) == Working, + // Resource manager receives an abort message from the transaction manager + messages.contains(Abort), + }, + RM::states' = RM::states.set(resourceManager, Aborted), + // There is no need to let others know that this resource manager aborted + messages' = messages + } + + // A resource manager commits due to a Commit message + action RM::commit(resourceManager: str): bool = all { + messages.contains(Commit), + RM::states' = RM::states.set(resourceManager, Committed), + messages' = messages + } + + action step = any { + // Resource manager actions + all { + nondet rm = resourceManagers.oneOf() + any { RM::prepare(rm), RM::abort(rm), RM::commit(rm) }, + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, + }, + // Transaction manager decisions (commit or abort) + all { + any { TM::decideOnCommit, TM::decideOnAbort }, + TM::preparedRMs' = TM::preparedRMs, + RM::states' = RM::states, + }, + // Transaction managers message consumption + all { + nondet rm = resourceManagers.oneOf() + TM::addPreparedResourceManager(rm), + TM::state' = TM::state, + RM::states' = RM::states, + messages' = messages, + } + } + + /// Two resource managers have not arrived at conflicting decisions + val consistencyInv = tuples(resourceManagers, resourceManagers).forall(((r1, r2)) => + not(RM::states.get(r1) == Committed and RM::states.get(r2) == Aborted) + ) +} + +module two_phase_commit_3 { + import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + + /// Compose two actions: send an RMPrepare message and consume it in the + /// transaction manager + run preparation(rm) = (all { + RM::prepare(rm), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, + }).then(all { + TM::addPreparedResourceManager(rm), + TM::state' = TM::state, + RM::states' = RM::states, + messages' = messages, + }) + + /// Compose several actions: The transaction manager decides to commit and + /// each resource manager consumes its Commit message + run commitment = (all { + TM::decideOnCommit, + TM::preparedRMs' = TM::preparedRMs, + RM::states' = RM::states, + }).then(all { + RM::commit("rm1"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, + }).then(all { + RM::commit("rm2"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, + }).then(all { + RM::commit("rm3"), + TM::state' = TM::state, + TM::preparedRMs' = TM::preparedRMs, + }) + + run successTest = init + .then(preparation("rm1")) + .then(preparation("rm2")) + .then(preparation("rm3")) + .then(commitment) +} diff --git a/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt new file mode 100644 index 000000000..3bc33c343 --- /dev/null +++ b/examples/classic/distributed/TwoPhaseCommit/two_phase_commit_modules.qnt @@ -0,0 +1,208 @@ +// -*- mode: Bluespec; -*- + +/* This specification is a variation on ./two_phase_commit.qnt that experiments with + using modules to divides the state spaces to reflect possible state access in the + system. +*/ + +module message { + type T = + | Abort + | Commit + | Prepared(str) + + var channel: Set[T] + + action init: bool = { + channel' = Set() + } + + action stutter = all { + channel' = channel + } + + action send(m: T): bool = { + channel' = channel.union(Set(m)) + } + +} + +module resource_managers { + import message as msg + + type Status = | Working | Prepared | Committed | Aborted + var statuses : str -> Status + + action init(rms: Set[str]): bool = { + statuses' = rms.mapBy(r => Working) + } + + action stutter = all { + statuses' = statuses + } + + action prepare(resourceManager: str): bool = all { + statuses.get(resourceManager) == Working, + statuses' = statuses.set(resourceManager, Prepared), + msg::send(msg::Prepared(resourceManager)) + } + + action abort(resourceManager: str): bool = all { + or { + // Resource manager is working, and chooses to abort spontaneously + statuses.get(resourceManager) == Working, + // Resource manager receives an abort message from the transaction manager + msg::channel.contains(msg::Abort), + }, + statuses' = statuses.set(resourceManager, Aborted), + // There is no need to let others know that this resource manager aborted + msg::stutter, + } + + + // A resource manager commits due to a Commit message + action commit(resourceManager: str): bool = all { + msg::channel.contains(msg::Commit), + statuses' = statuses.set(resourceManager, Committed), + msg::stutter, + } + + + def consistencyInv(resourceManagers) = + tuples(resourceManagers, resourceManagers) + .forall(((r1, r2)) => + not( statuses.get(r1) == Committed + and + statuses.get(r2) == Aborted)) +} + +module transaction_manager { + import message as msg + + type Status = | TMInitiated | TMCommitted | TMAborted + + var status : Status + /// The set of resource managers from which the transaction manager has + /// received msg::Prepared messages + var preparedRMs : Set[str] + + action init: bool = all { + status' = TMInitiated, + preparedRMs' = Set(), + } + + action stutter = all { + status' = status, + preparedRMs' = preparedRMs, + } + + /// The transaction manager receives a RMPrepared(rm) message from the resource manager rm + action addPreparedResourceManager(resourceManager: str): bool = all { + status == TMInitiated, + msg::channel.contains(msg::Prepared(resourceManager)), + preparedRMs' = preparedRMs.union(Set(resourceManager)), + status' = status, + } + + /// The transaction manager commits the transaction; enabled iff the + /// transaction manager is in its initial state and every resource manager has + /// sent an RMPrepared message. + action decideOnCommit(resourceManagers) = all { + status == TMInitiated, + preparedRMs == resourceManagers, + status' = TMCommitted, + preparedRMs' = preparedRMs, + msg::send(msg::Commit) + } + + /// The transaction manager spontaneously aborts the transaction + action decideOnAbort = all { + status == TMInitiated, + status' = TMAborted, + preparedRMs' = preparedRMs, + msg::send(msg::Abort) + } +} + +module two_phase_commit { + const resourceManagers: Set[str] + + import resource_managers as RM + import transaction_manager as TM + import message as msg + + action step = any { + // Resource manager actions + all { + nondet rm = resourceManagers.oneOf() + any { RM::prepare(rm), + RM::abort(rm), + RM::commit(rm) }, + TM::stutter + }, + // Transaction manager decisions (commit or abort) + all { + any { TM::decideOnCommit(resourceManagers), + TM::decideOnAbort }, + RM::stutter, + }, + // Transaction managers message consumption + all { + nondet rm = resourceManagers.oneOf() + TM::addPreparedResourceManager(rm), + RM::stutter, + msg::stutter + } + } + + action init = all { + msg::init, + TM::init, + RM::init(resourceManagers), + } + + /// Two resource managers have not arrived at conflicting decisions + val inv = RM::consistencyInv(resourceManagers) +} + +module two_phase_commit_tests { + import two_phase_commit(resourceManagers = Set("rm1", "rm2", "rm3")).* + + import resource_managers as RM + import transaction_manager as TM + import message as msg + + /// Compose two actions: send an RMPrepare message and consume it in the + /// transaction manager + run preparation(rm) = (all { + RM::prepare(rm), + TM::stutter, + }).then(all { + TM::addPreparedResourceManager(rm), + RM::stutter, + msg::stutter, + }) + + /// Compose several actions: The transaction manager decides to commit and + /// each resource manager consumes its Commit message + run commitment = (all { + TM::decideOnCommit(resourceManagers), + RM::stutter + }).then(all { + RM::commit("rm1"), + TM::stutter + }).then(all { + RM::commit("rm2"), + TM::stutter + }).then(all { + RM::commit("rm3"), + TM::stutter + }) + + run successTest = init.then(step).then(step) + // run successTest = init + // .then(preparation("rm1")) + // .then(preparation("rm2")) + // .then(preparation("rm3")) + // .then(commitment) +} diff --git a/examples/cosmos/bank/bank.qnt b/examples/cosmos/bank/bank.qnt new file mode 100644 index 000000000..73353dec8 --- /dev/null +++ b/examples/cosmos/bank/bank.qnt @@ -0,0 +1,202 @@ +// -*- mode: Bluespec; -*- +// An executable specification of the bank module +module bank { + //----------------------- type declarations ------------------------- + // Addresses are simply strings + type Addr = str + // Denominations are simply strings too + type Denom = str + // 64-bit and 256-bit integers are a special case of big integers. + // We have to take care of the bit width where it matters. + type Int64 = int + type Int256 = int + + // the maximum value for Int256 in Golang + pure val MAX_INT256 = 2^256 - 1 + + // the range of 256-bit integers in the SDK + pure def isInt256(i: int): bool = -2^256 < i and i < 2^256 + + // A coin is a record that contains a denomination and an amount + type Coin = { denom: Denom, amount: Int256 } + // Coins is a map from denominations to amounts + type Coins = Denom -> Int256 + // Account balances + type Balance = { address: Addr, coins: Coins } + + // A result that is produced by the functions that update the context + type BankResult = + | BankErr(str) + | BankOk(BankCtx) + + // A result that is produced by the functions that return a coin or panic + type CoinResult = + | CoinErr(str) + | CoinOk(Coin) + + // A result that is produced by the functions that return a Boolean or panic + type BoolResult = + | BoolErr(str) + | BoolOk(bool) + + // An input of a multiparty transfer + type Input = { + address: str, + coins: Coins, + } + // An output of a multiparty transfer + type Output = { + address: str, + coins: Coins, + } + // the portion of the context that is accessed by the bank module + type BankCtx = { + // block time (needed by vesting accounts) + blockTime: Int64, + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, + } + + // Parameters of the bank module + type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, + } + + //------- the module logic, that is, the logic of keepers ----------- + + /// `GetAllBalances` returns all the account balances for the given account address. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L61 + pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } + } + + /// `ValidateBalance` should only be called upon genesis state. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 + pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = ViewKeeper::GetAllBalances(ctx, addr) + // Implementation: Coins.IsValid also validates denominations + coins.keys().forall(denom => coins.get(denom) > 0), + // TODO: add validation logic for the vesting accounts + } + + /// GetBalance returns the balance of a specific denomination for a given account by address. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L98 + pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): CoinResult = { + if (ctx.balances.keys().contains(addr)) { + val accountBal = ctx.balances.get(addr) + if (accountBal.keys().contains(denom)) { + CoinOk({ denom: denom, amount: accountBal.get(denom) }) + } else { + CoinErr("Unmarshal error") + } + } else { + CoinErr("Unmarshal error") + } + } + + /// HasBalance returns whether or not an account has at least amt balance.\ + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L56 + pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): BoolResult = { + // Implementation: panic if the address or denomination are not stored? + match ViewKeeper::GetBalance(ctx, addr, coin.denom) { + | CoinOk(c) => BoolOk(c.amount >= coin.amount) + | CoinErr(msg) => BoolErr(msg) + } + } + + /// GetAccountsBalances returns all the accounts balances from the store. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L72 + pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + // The implementation may panic due to unmarshalling errors. + // Since these errors are not related to the parameters, we do not propagate them. + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) + } + + /// SendCoins transfers amt coins from a sending account to a receiving account. + /// An error is returned upon failure. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L135 + pure def SendKeeper::SendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankResult = { + // Implementation: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed another way, there is no precondition. + // TODO: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from fromAddr and add them to toAddr. + val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on fromAddr, or there is not enough funds + BankErr("invalid coins or insufficient funds") + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = ViewKeeper::GetAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + BankErr("overflow") + } else { + // add toAddr to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of fromAddr with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since toAddr may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // succeed with a new balance + BankOk({ ...ctx, balances: newBalances, accounts: newAccounts }) + } + } + } + + /// GetParams returns the total set of bank parameters. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L61 + pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + + /// SetParams sets the total set of bank parameters. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L67 + pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { + { ...ctx, params: params } + } + + /// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L315 + pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } + } + + /// IsSendEnabledCoins checks the coins provide and returns an ErrSendDisabled if + /// any of the coins are not configured for sending. Returns nil if sending is enabled + /// for all provided coin. + /// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L306C28-L306C28 + pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + // Implementation: return the error ErrSendDisabled on false + coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) + } +} diff --git a/examples/cosmos/bank/bankTest.qnt b/examples/cosmos/bank/bankTest.qnt new file mode 100644 index 000000000..d721d54d0 --- /dev/null +++ b/examples/cosmos/bank/bankTest.qnt @@ -0,0 +1,117 @@ +// -*- mode: Bluespec; -*- +module bankTest { + import bank.* from "./bank" + + // the state of the machine that tests the logic + // Total supply of coins per denomination + var supply: Denom -> Int256 + // Balances for each address + var balances: Addr -> Coins + // if non-empty, then it stores the last error message + var _lastError: str + // all addresses we would like to work with + pure val ADDR = Set("king", "donkeykong", "peaches", "mario") + // all denominations + pure val DENOM = Set("banana", "burger") + + // state transitions of the machine + // initialize the state machine + action init = all { + // limit the total supply of burgers and bananas to 10_000 + supply' = Set("banana", "burger").mapBy(d => 10_000), + // the king has it all + balances' = Map("king" -> Set("banana", "burger").mapBy(d => 10_000)), + _lastError' = "", + } + + action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { + val ctx = stateToCtx(0) + val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) + match result { + | BankOk(newCtx) => all { + balances' = newCtx.balances, + supply' = supply, + _lastError' = "", + } + | BankErr(msg) => all { + // We could simply return 'false' here. + // But we prefer to store the error message instead. + _lastError' = msg, + balances' = balances, + supply' = supply, + } + } + } + + action step = any { + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + nondet denom = oneOf(DENOM) + nondet amt = (-10).to(supply.get(denom)).oneOf() + send(fromAddr, toAddr, Set(denom).mapBy(d => amt)) + } + + // protocol invariants + // sum up amounts over all balances for a given denomination + def sumForDenom(denom: Denom): Int256 = { + balances.keys().fold(0, (sum, addr) => { + val coins = balances.get(addr) + if (denom.in(coins.keys())) { + sum + coins.get(denom) + } else { + sum + } + }) + } + + // The total Supply of the network is equal to the sum of all coins from the account + val totalSupplyInv = { + supply.keys().forall(denom => (sumForDenom(denom) == supply.get(denom))) + } + + // tests + run getAllBalancesTest = { + init + .expect( + val ctx = stateToCtx(0) + val kings = ViewKeeper::GetAllBalances(ctx, "king") + val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") + and { + assert(kings.keys() == Set("banana", "burger")), + assert(kings.get("banana") == 10_000), + assert(kings.get("burger") == 10_000), + assert(donkeys.keys() == Set()), + } + ) + } + + // a helper operator that produces a context from a state + def stateToCtx(time: int): BankCtx = { + { + blockTime: time, + accounts: balances.keys(), + balances: balances, + params: { + sendEnabled: Set(), + defaultSendEnabled: true + } + } + } + + run sendTest = { + init + // the King has bananas and he can send it + .then(send("king", + "donkeykong", + Map("banana" -> 2_000))) + .expect(and { + balances.get("king").get("banana") == 8_000, + balances.get("donkeykong").get("banana") == 2_000, + balances.get("king").get("burger") == 10_000, + balances.get("donkeykong").keys() == Set("banana"), + }) + // Donkeykong does not have any burgers, so this action must fail + .then(send("donkeykong", "peaches", Set("burger").mapBy(d => 1_000))) + .expect(_lastError == "invalid coins or insufficient funds") + } +} diff --git a/examples/cosmos/bank/cosmos-bank.md b/examples/cosmos/bank/cosmos-bank.md new file mode 100644 index 000000000..c8ddcabf8 --- /dev/null +++ b/examples/cosmos/bank/cosmos-bank.md @@ -0,0 +1,739 @@ +# Onboarding to the module `x/bank` of Cosmos SDK + +**Author**: Igor Konnov, Informal Systems, 2023 + +**Version**: Cosmos SDK [v0.46.10](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/). + +**This page is still experimental. We believe that Cosmos documentation will +become executable one day.** + +## Abstract + +This document shows how we could turn an inanimate piece of documentation into +an executable specification. We are using the [bank module][] of Cosmos SDK as +an example. In the following, all of the quoted text belongs to the original +description on the [bank module][] page, unless specified otherwise. To obtain +a Quint module, run [lmt][] against this document. Check the executable +specification in [bank.qnt](./bank.qnt) and [bankTest.qnt](./bankTest.qnt). +We follow the same order of exposition, as in the original document. + +Importantly, this description is tuned towards ease of exposition, not for +implementation or verification. Remember that we do not want to make protocols +as complex as their implementation! These are the most illuminating differences: + + - We use abstract data types whenever possible, e.g., big integers, sets, and maps. + + - We abstract error codes to `true` (no error) and `false` (error). The actual + error codes belong to the implementation details. They are written in comments. + +> The bank module is responsible for handling multi-asset coin transfers +> between accounts and tracking special-case pseudo-transfers which must work +> differently with particular kinds of accounts (notably +> delegating/undelegating for vesting accounts). It exposes several interfaces +> with varying capabilities for secure interaction with other modules which +> must alter user balances. +> +> In addition, the bank module tracks and provides query support for the total +> supply of all assets used in the application. + +From the engineer's perspective, the bank module looks as follows: + +```bluespec bank.qnt += +// -*- mode: Bluespec; -*- +// An executable specification of the bank module +module bank { + //----------------------- type declarations ------------------------- + <<>> + + //------- the module logic, that is, the logic of keepers ----------- + + <<>> +} +``` + +From the protocol designer's point of view, the bank module alone could be +tested by introducing the following non-deterministic state machine: + +```bluespec bankTest.qnt += +// -*- mode: Bluespec; -*- +module bankTest { + import bank.* from "./bank" + + // the state of the machine that tests the logic + <<>> + + // state transitions of the machine + <<>> + + // protocol invariants + <<>> + + // tests + <<>> +} +``` + +## Basic protocol types + +These are the types that we are using in the protocol specification. +The actual implementation uses different types. **This is not a bug, but a +feature!** By using more abstract types, we make the protocol description +much easier to read and understand. + +```bluespec "types" += +// Addresses are simply strings +type Addr = str +// Denominations are simply strings too +type Denom = str +// 64-bit and 256-bit integers are a special case of big integers. +// We have to take care of the bit width where it matters. +type Int64 = int +type Int256 = int + +// the maximum value for Int256 in Golang +pure val MAX_INT256 = 2^256 - 1 + +// the range of 256-bit integers in the SDK +pure def isInt256(i: int): bool = -2^256 < i and i < 2^256 + +// A coin is a record that contains a denomination and an amount +type Coin = { denom: Denom, amount: Int256 } +// Coins is a map from denominations to amounts +type Coins = Denom -> Int256 +// Account balances +type Balance = { address: Addr, coins: Coins } + +// A result that is produced by the functions that update the context +type BankResult = + | BankErr(str) + | BankOk(BankCtx) + +// A result that is produced by the functions that return a coin or panic +type CoinResult = + | CoinErr(str) + | CoinOk(Coin) + +// A result that is produced by the functions that return a Boolean or panic +type BoolResult = + | BoolErr(str) + | BoolOk(bool) + +``` + +**Implementation details.** There are a few important points to be made about +the implementation of the above types in Cosmos SDK: + + - The type `Addr` is implemented with `AccAddress` in + [address.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/address.go), which is `byte[]`. + It must be a + [bech32 address](https://docs.cosmos.network/main/spec/addresses/bech32). + We omit the validation logic in this specification, as it is not relevant + to the understanding of the banking module. + + - The type `Denom` is implemented in + [denom.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/denom.go). It must match the regular expression `[a-zA-Z][a-zA-Z0-9/:._-]{2,127}`. + Again, we omit the validation logic in the Quint specification + + - The type `Coin` is implemented in + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). + Coins must carry non-negative amounts. + + - The type `Coins` is implemented in + [coin.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/types/coin.go). + The implementation stores `Coins` as an array `[]Coin`. + Since an array is not a set, the implementation contains additional + non-trivial validation logic in + [Coins.Validate](https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/types/coin.go#L229) + to make sure that: + + - The amount assigned to every denomination is positive (that is, `amount > 0`). + - Coins are sorted in the order of their denominations. + - There are no duplicate denominations. + +## Supply + +> The supply functionality: +> +> passively tracks the total supply of coins within a chain, provides a pattern +> for modules to hold/interact with Coins, and introduces the invariant check to +> verify a chain's total supply. + +### Total Supply + +> The total Supply of the network is equal to the sum of all coins from the +> account. The total supply is updated every time a Coin is minted (eg: as part +> of the inflation mechanism) or burned (eg: due to slashing or if a governance +> proposal is vetoed). + +This is a perfect opportunity to define a state invariant: + +```bluespec "invariants" += +// sum up amounts over all balances for a given denomination +def sumForDenom(denom: Denom): Int256 = { + balances.keys().fold(0, (sum, addr) => { + val coins = balances.get(addr) + if (denom.in(coins.keys())) { + sum + coins.get(denom) + } else { + sum + } + }) +} + +// The total Supply of the network is equal to the sum of all coins from the account +val totalSupplyInv = { + supply.keys().forall(denom => (sumForDenom(denom) == supply.get(denom))) +} +``` + +## Module Accounts + +SKIPPED, see [Module +accounts](https://docs.cosmos.network/v0.46/modules/bank/#module-accounts). + +## State + +> The x/bank module keeps state of three primary objects, account balances, +> denom metadata and the total supply of all balances. + +The hex value represents the key in the key-value store, that is, +instead of using an ASCIIZ string, Cosmos SDK developers are using a single +byte as a key. + +> - Supply: `0x0 | byte(denom) -> byte(amount)` + +We represent this field as a map in the protocol specification: + +```bluespec "state" += +// Total supply of coins per denomination +var supply: Denom -> Int256 +``` + +> - Denom Metadata: `0x1 | byte(denom) -> ProtocolBuffer(Metadata)` + +> - Balances: `0x2 | byte(address length) | []byte(address) | []byte(balance.Denom) -> ProtocolBuffer(balance)` + +We represent this field as a map in the protocol specification: + +```bluespec "state" += +// Balances for each address +var balances: Addr -> Coins +``` + +For protocol debugging purposes, we introduce a state variable that keeps +the last error message. It makes it easier to write tests. To indicate that +this variable is not, strictly speaking, part of the protocol, we start its +name with underscore: + +```bluespec "state" += +// if non-empty, then it stores the last error message +var _lastError: str +``` + +We could initialize the state via `init`, which would be similar to executing +genesis transactions in Cosmos: + +```bluespec "transitions" += +// initialize the state machine +action init = all { + // limit the total supply of burgers and bananas to 10_000 + supply' = Set("banana", "burger").mapBy(d => 10_000), + // the king has it all + balances' = Map("king" -> Set("banana", "burger").mapBy(d => 10_000)), + _lastError' = "", +} + +``` + +## Keepers + +> The bank module provides these exported keeper interfaces that can be passed +> to other modules that read or update account balances. Modules should use +> the least-permissive interface that provides the functionality they require. +> +> Best practices dictate careful review of bank module code to ensure that +> permissions are limited in the way that you expect. + +### Blocklisting Addresses + +> The x/bank module accepts a map of addresses that are considered blocklisted +> from directly and explicitly receiving funds through means such as MsgSend +> and MsgMultiSend and direct API calls like SendCoinsFromModuleToAccount. +> +> Typically, these addresses are module accounts. If these addresses receive +> funds outside the expected rules of the state machine, invariants are likely +> to be broken and could result in a halted network. +> +> By providing the x/bank module with a blocklisted set of addresses, an error +> occurs for the operation if a user or client attempts to directly or +> indirectly send funds to a blocklisted account, for example, by using IBC. + +**TODO: we are skipping this feature in the spec for now** + +### Common Types + +#### Input + +> An input of a multiparty transfer + +The type in Quint: + +```bluespec "types" += +// An input of a multiparty transfer +type Input = { + address: str, + coins: Coins, +} +``` + +The type in protobuf: + +```protobuf +// Input models transaction input. +message Input { + string address = 1; + repeated cosmos.base.v1beta1.Coin coins = 2; +} +``` + +#### Output + +An output of a multiparty transfer. + +The type in Quint: + +```bluespec "types" += +// An output of a multiparty transfer +type Output = { + address: str, + coins: Coins, +} +``` + +The type in protobuf: + +```protobuf +// Output models transaction outputs. +message Output { + string address = 1; + repeated cosmos.base.v1beta1.Coin coins = 2; +} +``` + +### ViewKeeper, SendKeeper, and BaseKeeper + +> The base keeper provides full-permission access: the ability to arbitrary +> modify any account's balance and mint or burn coins. +> +> Restricted permission to mint per module could be achieved by using +> baseKeeper with WithMintCoinsRestriction to give specific restrictions to +> mint (e.g. only minting certain denom). + +`BaseKeeper` includes plenty of methods. It extends two other interfaces +as follows: + +```mermaid +classDiagram + direction LR + ViewKeeper <|-- SendKeeper + SendKeeper <|-- BaseKeeper +``` + +We define the part of the SDK context that is accessed by the bank module: + +```bluespec "types" += +// the portion of the context that is accessed by the bank module +type BankCtx = { + // block time (needed by vesting accounts) + blockTime: Int64, + // accessed via AccountKeeper + accounts: Set[Addr], + // the balances are the essential part of the bank module + balances: Addr -> Coins, + // module parameters + params: Params, +} + +``` + +#### ViewKeeper + +`ViewKeeper` is extended by `SendKeeper`, extended by `BaseKeeper`. +Its code can be found in [view.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/view.go). + + - `getAllBalances` returns all the account balances for the given account + address: + +```bluespec "functional" += +/// `GetAllBalances` returns all the account balances for the given account address. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L61 +pure def ViewKeeper::GetAllBalances(ctx: BankCtx, addr: Addr): Coins = { + if (ctx.balances.keys().contains(addr)) { + ctx.balances.get(addr) + } else { + Map() + } +} + +``` + +For example, we expect the `GetAllBalances` to return balances in the genesis state as follows: + +```bluespec "tests" += +run getAllBalancesTest = { + init + .expect( + val ctx = stateToCtx(0) + val kings = ViewKeeper::GetAllBalances(ctx, "king") + val donkeys = ViewKeeper::GetAllBalances(ctx, "donkeykong") + and { + assert(kings.keys() == Set("banana", "burger")), + assert(kings.get("banana") == 10_000), + assert(kings.get("burger") == 10_000), + assert(donkeys.keys() == Set()), + } + ) +} + +// a helper operator that produces a context from a state +def stateToCtx(time: int): BankCtx = { + { + blockTime: time, + accounts: balances.keys(), + balances: balances, + params: { + sendEnabled: Set(), + defaultSendEnabled: true + } + } +} + +``` + + - `ValidateBalance` validates all balances for a given account address + returning an error if any balance is invalid. It checks for vesting + account types and validate the balances against the original vesting + balances. CONTRACT: ValidateBalance should only be called upon genesis + state. In the case of vesting accounts, balances may change in a valid + manner that would otherwise yield an error from this call. + +```bluespec "functional" += +/// `ValidateBalance` should only be called upon genesis state. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L202 +pure def ViewKeeper::ValidateBalance(ctx: BankCtx, addr: Addr): bool = and { + ctx.accounts.contains(addr), + val coins = ViewKeeper::GetAllBalances(ctx, addr) + // Implementation: Coins.IsValid also validates denominations + coins.keys().forall(denom => coins.get(denom) > 0), + // TODO: add validation logic for the vesting accounts +} + +``` + + - `getBalance` returns the balance of a specific denomination + for a given account by address: + +```bluespec "functional" += +/// GetBalance returns the balance of a specific denomination for a given account by address. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L98 +pure def ViewKeeper::GetBalance(ctx: BankCtx, addr: Addr, denom: str): CoinResult = { + if (ctx.balances.keys().contains(addr)) { + val accountBal = ctx.balances.get(addr) + if (accountBal.keys().contains(denom)) { + CoinOk({ denom: denom, amount: accountBal.get(denom) }) + } else { + CoinErr("Unmarshal error") + } + } else { + CoinErr("Unmarshal error") + } +} + +``` + + - `HasBalance` returns whether or not an account has at least amt balance: + +```bluespec "functional" += +/// HasBalance returns whether or not an account has at least amt balance.\ +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L56 +pure def ViewKeeper::HasBalance(ctx: BankCtx, addr: Addr, coin: Coin): BoolResult = { + // Implementation: panic if the address or denomination are not stored? + match ViewKeeper::GetBalance(ctx, addr, coin.denom) { + | CoinOk(c) => BoolOk(c.amount >= coin.amount) + | CoinErr(msg) => BoolErr(msg) + } +} + +``` + + - `GetAccountsBalances` returns all the accounts balances from the store: + +```bluespec "functional" += +/// GetAccountsBalances returns all the accounts balances from the store. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/view.go#L72 +pure def ViewKeeper::GetAccountsBalances(ctx: BankCtx): Set[Balance] = { + // The implementation may panic due to unmarshalling errors. + // Since these errors are not related to the parameters, we do not propagate them. + ctx.balances.keys().map(a => { address: a, coins: ctx.balances.get(a) }) +} + +``` + + - `LockedCoins` returns all the coins that are not spendable + (i.e. locked) for an account by address. For standard accounts, the + result will always be no coins. For vesting accounts, LockedCoins is + delegated to the concrete vesting account type. + + **TODO:** This requires vesting accounts. + + - `SpendableCoins` returns the total balances of spendable coins for an + account by address. If the account has no spendable coins, an empty + Coins slice is returned. + + **TODO:** This requires vesting accounts. + + - `IterateAccountBalances` iterates over the balances of a single account + and provides the token balance to a callback. If true is returned from + the callback, iteration is halted. + + **TODO** + + - `IterateAllBalances` iterates over all the balances of all accounts and + denominations that are provided to a callback. If true is returned from + the callback, iteration is halted. + + **TODO** + +#### SendKeeper + +`SendKeeper` extends `ViewKeeper` and is extended by `BaseKeeper`. +Its code can be found in +[send.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/send.go). + + - `SendCoins` transfers amt coins from a sending account to a receiving account. + An error is returned upon failure. At the protocol level, `sendCoins` does not + update the context in place, but it returns a new context. + The value `false` is returned in case of error or panic. + +
+ Click to see how SendCoins works + +```bluespec "functional" += +/// SendCoins transfers amt coins from a sending account to a receiving account. +/// An error is returned upon failure. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L135 +pure def SendKeeper::SendCoins(ctx: BankCtx, + fromAddr: Addr, toAddr: Addr, amt: Coins): BankResult = { + // Implementation: if Coins are constructed with NewCoins, they must be positive. + // However, if they are constructed another way, there is no precondition. + // TODO: checking LockedCoins that deal with vested coins. + // Safely subtract the coins from fromAddr and add them to toAddr. + val fromCoins = ViewKeeper::GetAllBalances(ctx, fromAddr) + if (amt.keys().exists(d => + not(d.in(fromCoins.keys())) or fromCoins.get(d) < amt.get(d))) { + // some denominations do not exist on fromAddr, or there is not enough funds + BankErr("invalid coins or insufficient funds") + } else { + // x/bank invariants prohibit persistence of zero balances + // clean zero balances + def getOr0(coins: Coins, d: str): int = if (d.in(coins.keys())) coins.get(d) else 0 + val positiveDenoms = fromCoins.keys().filter(d => fromCoins.get(d) > getOr0(amt, d)) + val subCoins = positiveDenoms.mapBy(d => fromCoins.get(d) - getOr0(amt, d)) + // add coins to toAddr: the tricky part is that the denominations may differ + val toCoins = ViewKeeper::GetAllBalances(ctx, toAddr) + // extend the toCoins and amt with zeroes over the joint denominations + val jointDenoms = toCoins.keys().union(amt.keys()) + // since toCoins and amt held positive values, their sums must be positive too + val addCoins = jointDenoms.mapBy(d => getOr0(toCoins, d) + getOr0(amt, d)) + if (addCoins.keys().exists(d => addCoins.get(d) > MAX_INT256)) { + BankErr("overflow") + } else { + // add toAddr to the accounts, if it did not exist + val newAccounts = ctx.accounts.union(Set(toAddr)) + val newBalances = + if (fromAddr == toAddr) { + ctx.balances + } else { + // Update the balance of fromAddr with subCoins. + val newBalancesSub = ctx.balances.set(fromAddr, subCoins) + // Since toAddr may be a new account, extend the map, if needed + newBalancesSub.put(toAddr, addCoins) + } + // succeed with a new balance + BankOk({ ...ctx, balances: newBalances, accounts: newAccounts }) + } + } +} + +``` +
+ +```bluespec "transitions" += +action send(fromAddr: Addr, toAddr: Addr, coins: Coins): bool = all { + val ctx = stateToCtx(0) + val result = SendKeeper::SendCoins(ctx, fromAddr, toAddr, coins) + match result { + | BankOk(newCtx) => all { + balances' = newCtx.balances, + supply' = supply, + _lastError' = "", + } + | BankErr(msg) => all { + // We could simply return 'false' here. + // But we prefer to store the error message instead. + _lastError' = msg, + balances' = balances, + supply' = supply, + } + } +} +``` + +Here is a basic test of `send`: + +```bluespec "tests" += +run sendTest = { + init + // the King has bananas and he can send it + .then(send("king", + "donkeykong", + Map("banana" -> 2_000))) + .expect(and { + balances.get("king").get("banana") == 8_000, + balances.get("donkeykong").get("banana") == 2_000, + balances.get("king").get("burger") == 10_000, + balances.get("donkeykong").keys() == Set("banana"), + }) + // Donkeykong does not have any burgers, so this action must fail + .then(send("donkeykong", "peaches", Set("burger").mapBy(d => 1_000))) + .expect(_lastError == "invalid coins or insufficient funds") +} +``` + + - `InputOutputCoins` performs multi-send functionality. It accepts a series of + inputs that correspond to a series of outputs. It returns an error if the + inputs and outputs don't lineup or if any single transfer of tokens fails. + + **TODO** + + - `GetParams` returns the total set of bank parameters. + +```bluespec "functional" += +/// GetParams returns the total set of bank parameters. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L61 +pure def SendKeeper::GetParams(ctx: BankCtx): Params = ctx.params + +``` + + - `SetParams` sets the total set of bank parameters. + +```bluespec "functional" += +/// SetParams sets the total set of bank parameters. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L67 +pure def SendKeeper::SetParams(ctx: BankCtx, params: Params): BankCtx = { + { ...ctx, params: params } +} + +``` + + - `IsSendEnabledCoin` returns the current SendEnabled status of the provided + coin's denom. + +```bluespec "functional" += +/// IsSendEnabledCoin returns the current SendEnabled status of the provided coin's denom. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L315 +pure def SendKeeper::IsSendEnabledCoin(ctx: BankCtx, coin: Coin): bool = { + val found = ctx.params.sendEnabled.filter(p => coin.denom == p.denom) + if (found != Set()) { + found.exists(p => p.enabled) + } else { + ctx.params.defaultSendEnabled + } +} + +``` + + - `IsSendEnabledCoins` checks the coins provide and returns an `ErrSendDisabled` if + any of the coins are not configured for sending. Returns `nil` if sending is enabled + for all provided coin. + +```bluespec "functional" += +/// IsSendEnabledCoins checks the coins provide and returns an ErrSendDisabled if +/// any of the coins are not configured for sending. Returns nil if sending is enabled +/// for all provided coin. +/// https://github.com/cosmos/cosmos-sdk/blob/06406f6a70f228bbb6d09b45a4e343477f1ef7e9/x/bank/keeper/send.go#L306C28-L306C28 +pure def SendKeeper::IsSendEnabledCoins(ctx: BankCtx, coins: Set[Coin]): bool = { + // Implementation: return the error ErrSendDisabled on false + coins.forall(c => SendKeeper::IsSendEnabledCoin(ctx, c)) +} +``` + + - `BlockedAddr` checks if a given address is restricted from receiving funds. + + +#### BaseKeeper + +`BaseKeeper` extends `SendKeeper`. Its code can be found in +[keeper.go](https://github.com/cosmos/cosmos-sdk/blob/v0.46.10/x/bank/keeper/keeper.go). + +**TODO: add the description** + +## Parameters + +> The bank module contains the following parameters: + +| Key | Type | Example | +| -------------------- | --------------- | ------------------------------------ | +| `SendEnabled` | `[]SendEnabled` | `[{denom: "stake", enabled: true }]` | +| `DefaultSendEnabled` | `bool` | `true` | + +### SendEnabled + +The send enabled parameter is an array of `SendEnabled` entries mapping coin +denominations to their send_enabled status. Entries in this list take precedence +over the `DefaultSendEnabled` setting. + +### DefaultSendEnabled + +The default send enabled value controls send transfer capability for all coin denominations unless specifically included in the array of SendEnabled parameters. + +### Parameters in Quint + +We pack `SendEnabled` and `DefaultSendEnabled` in the record `Params`: + +```bluespec "types" += +// Parameters of the bank module +type Params = { + // whether coin send is enabled for specific denominations + sendEnabled: Set[{ denom: str, enabled: bool }], + // whether coin send is enabled by default + defaultSendEnabled: bool, +} +``` + +### Appendix + +This part contains technical parts of the specification that are not that +interesting. + +```bluespec "state" += +// all addresses we would like to work with +pure val ADDR = Set("king", "donkeykong", "peaches", "mario") +// all denominations +pure val DENOM = Set("banana", "burger") +``` + +```bluespec "transitions" += + +action step = any { + nondet fromAddr = oneOf(ADDR) + nondet toAddr = oneOf(ADDR) + nondet denom = oneOf(DENOM) + nondet amt = (-10).to(supply.get(denom)).oneOf() + send(fromAddr, toAddr, Set(denom).mapBy(d => amt)) +} +``` + + +[bank module]: https://docs.cosmos.network/v0.46/modules/bank/# +[lmt]: https://github.com/driusan/lmt diff --git a/examples/cosmos/ics20/ics20.qnt b/examples/cosmos/ics20/ics20.qnt index 6ee7a5bee..83df4da90 100644 --- a/examples/cosmos/ics20/ics20.qnt +++ b/examples/cosmos/ics20/ics20.qnt @@ -611,7 +611,7 @@ module ics20Test { // Check that there is a single incoming acknowledgement on chain A, // that indicates failure. assert(chainStates.get("B").inAcknowledgements.size() == 1), - val ack = chainStates.get("B").inAcknowledgements.oneOf() + nondet ack = chainStates.get("B").inAcknowledgements.oneOf() assert(ack.success == false and ack.errorMessage == "transfer coins failed"), // Process the acknowledgement on chain A; this triggers step 3.6 above. diff --git a/examples/cosmos/lightclient/Lightclient.qnt b/examples/cosmos/lightclient/Lightclient.qnt index 5d7f6458f..3a31d525e 100644 --- a/examples/cosmos/lightclient/Lightclient.qnt +++ b/examples/cosmos/lightclient/Lightclient.qnt @@ -199,7 +199,7 @@ module Lightclient { // Record that one more probe has been done (for complexity and model checking) nprobes' = nprobes + 1, // Verify the current block - nondet verdict = API::ValidAndVerified(latestVerified, current, true) + val verdict = API::ValidAndVerified(latestVerified, current, true) all { MonitorTransition(latestVerified, current, API::localClock, verdict), // Decide whether/how to continue diff --git a/examples/cosmos/lightclient/typedefs.qnt b/examples/cosmos/lightclient/typedefs.qnt index 342e8ab7f..9de850f85 100644 --- a/examples/cosmos/lightclient/typedefs.qnt +++ b/examples/cosmos/lightclient/typedefs.qnt @@ -13,8 +13,8 @@ module typedefs { Commits: Set[str] } - type Blockchain = int -> blockHeader - type LightBlockMap = int -> lightBlock + type Blockchain = int -> BlockHeader + type LightBlockMap = int -> LightBlock type LightBlockStatus = int -> str -} \ No newline at end of file +} diff --git a/examples/cosmwasm/zero-to-hero/vote.qnt b/examples/cosmwasm/zero-to-hero/vote.qnt index 88e686fbd..fed0492b9 100644 --- a/examples/cosmwasm/zero-to-hero/vote.qnt +++ b/examples/cosmwasm/zero-to-hero/vote.qnt @@ -489,10 +489,7 @@ module state { ) // assert that aggregated sum in `polls[poll_id]` equals the sum from above val poll = state.polls.get(poll_id) - poll.options.listForall(option => - val optionKey = option._1 - // FIXME(#1167): Type annotation below is a workaround, inferred type is too general - val optionSum: int = option._2 + poll.options.listForall(((optionKey, optionSum)) => // `ballots` only contains entries if there are > 0 votes. optionSum > 0 implies and { summed_ballots.keys().contains(optionKey), @@ -513,5 +510,5 @@ module state { // already submitted ballots in `ballots`, but `execute_vote` adjusts // the sum differently based on whether such a ballot is present.] val invAllBallotsPositive = query_all_polls(state).polls.listForall(poll => - poll.options.listForall(opt => opt._2 >= 0)) + poll.options.listForall2(opt => opt._2 >= 0)) } diff --git a/examples/games/secret-santa/secret_santa.qnt b/examples/games/secret-santa/secret_santa.qnt new file mode 100644 index 000000000..f9eb68da7 --- /dev/null +++ b/examples/games/secret-santa/secret_santa.qnt @@ -0,0 +1,130 @@ +// -*- mode: Bluespec; -*- +/** + * A secret santa spec, in celebration of the 2023 end-of-year holidays. + * This is accompanied by a blogpost! See [1]. + * + * [1]: https://github.com/informalsystems/quint/tree/main/tutorials/blogpost0-secretsanta/secret_santa.org + * + * Gabriela Moreira, Informal Systems, 2023 + */ + +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// A map from santas to their recipients. get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// The bowl of participants, containing a paper piece for each participant's name + var bowl: Set[str] + + /// Information about the last draw + type LastDraw = + | Self(str) // The name of someone who drew themself + | Ok // The draw was Ok + + var last_draw: LastDraw + + /// Who had already drawn a paper when someone got themself. This way, I know + /// that none of those people can be the santa of the person who is drawing. + var gabrielas_memory: str -> Set[str] + + /// The initial state + action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl + last_draw' = Ok, // if no oe has drawn yet, no one has drawn themself + gabrielas_memory' = Map(), + } + + val santas = recipient_for_santa.keys() + val recipients = recipient_for_santa.values() + + action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + last_draw' = if (santa == recipient) Self(santa) else Ok, + gabrielas_memory' = gabrielas_memory, // Nothing to memorize, so the memory stays the same + } + } + + action stutter = all { + recipient_for_santa' = recipient_for_santa, + bowl' = bowl, + last_draw' = last_draw, + gabrielas_memory' = gabrielas_memory, + } + + action step = + if (empty(bowl)) { + stutter + } else { + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } + + action redraw(participant: str): bool = { + // Draw from the current bowl, without having first put paper back + nondet new_recipient = oneOf(bowl) + all { + new_recipient != participant, // The action requires this precondition + // Remove the new paper from the bowl, and then put the old one back in + bowl' = bowl.exclude(Set(new_recipient)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.put(participant, new_recipient), + last_draw' = Ok // We know this is OK due to the precondition + } + } + + // Store current santas (people who have already drawn) on a participant's key, meaning that they can't be that participant's santa + action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, santas) + } + + action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + not(empty(bowl)), + redraw(participant), + memorize(participant), + } + } + + action step_with_reset = + if (last_draw == Ok) { + step + } else { + init + } + + /* PROPERTIES */ + + val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) + + val no_person_is_self_santa = santas.forall(santa => + get(recipient_for_santa, santa) != santa + ) + + val inv = (last_draw == Ok) implies no_person_is_self_santa + + /// true iff Gabriela can find out who is a santa for someone. + /// That is, if exists a participant where find_out_a_santa_for participant is Some() + val gabriela_finds_out_a_santa = participants.exists(participant => { + if (gabrielas_memory.has(participant)) { + val possible_santas = participants.exclude(gabrielas_memory.get(participant)) + possible_santas.size() == 1 + } else { + false + } + }) + + val safe_from_memorizers = not(gabriela_finds_out_a_santa) +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} diff --git a/examples/puzzles/tictactoe/tictactoe.qnt b/examples/games/tictactoe/tictactoe.qnt similarity index 73% rename from examples/puzzles/tictactoe/tictactoe.qnt rename to examples/games/tictactoe/tictactoe.qnt index e609ec131..4c272e087 100644 --- a/examples/puzzles/tictactoe/tictactoe.qnt +++ b/examples/games/tictactoe/tictactoe.qnt @@ -12,10 +12,14 @@ * Gabriela Moreira, Informal Systems, 2022-2023 */ module tictactoe { + type Player = X | O + type Square = Occupied(Player) | Empty + /// A 3x3 tic-tac-toe board - var board: int -> (int -> str) + var board: int -> (int -> Square) + /// Who goes next - var nextTurn: str + var nextTurn: Player pure val boardCoordinates = tuples(1.to(3), 1.to(3)) @@ -40,33 +44,41 @@ module tictactoe { (3,3) ) - def hasValue(coordinate, player) = - board.get(coordinate._1).get(coordinate._2) == player + def square(coordinate: (int, int)): Square = + board.get(coordinate._1).get(coordinate._2) - def isEmpty(coordinate) = hasValue(coordinate, "_") + def hasPlayer(coordinate, player) = match square(coordinate) { + | Empty => false + | Occupied(p) => player == p + } + + def isEmpty(coordinate) = match square(coordinate) { + | Empty => true + | _ => false + } val boardEmpty = boardCoordinates.forall(isEmpty) def won(player) = winningPatterns.exists(pattern => - pattern.forall(coordinate => hasValue(coordinate, player)) + pattern.forall(coordinate => hasPlayer(coordinate, player)) ) val boardFull = not(boardCoordinates.exists(isEmpty)) - val stalemate = boardFull and not(won("X")) and not(won("O")) - val gameOver = won("X") or won("O") or boardFull + val stalemate = boardFull and not(won(X)) and not(won(O)) + val gameOver = won(X) or won(O) or boardFull def canWinWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("X")).size() == 2, + pattern.filter(coordinate => coordinate.hasPlayer(X)).size() == 2, pattern.filter(coordinate => coordinate.isEmpty()).size() == 1, } def canBlockWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("O")).size() == 2, + pattern.filter(coordinate => coordinate.hasPlayer(O)).size() == 2, pattern.filter(coordinate => coordinate.isEmpty()).size() == 1, } def canSetupWinWithPattern(pattern) = and { - pattern.filter(coordinate => coordinate.hasValue("X")).size() == 1, + pattern.filter(coordinate => coordinate.hasPlayer(X)).size() == 1, pattern.filter(coordinate => coordinate.isEmpty()).size() == 2, } @@ -79,7 +91,7 @@ module tictactoe { isEmpty(coordinate), board' = board.setBy( coordinate._1, - row => row.set(coordinate._2, player) + row => row.set(coordinate._2, Occupied(player)) ), } @@ -87,22 +99,22 @@ module tictactoe { canWin, nondet pattern = winningPatterns.filter(canWinWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } action Block = all { canBlock, nondet pattern = winningPatterns.filter(canBlockWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } - action TakeCenter = Move("X", (2, 2)) + action TakeCenter = Move(X, (2, 2)) action SetupWin = all { nondet pattern = winningPatterns.filter(canSetupWinWithPattern).oneOf() nondet coordinate = pattern.filter(isEmpty).oneOf() - Move("X", coordinate), + Move(X, coordinate), } action MoveToEmpty(player) = @@ -111,32 +123,32 @@ module tictactoe { action StartInCorner = nondet corner = oneOf(corners) - Move("X", corner) + Move(X, corner) action MoveX = all { - nextTurn == "X", - not(won("O")), + nextTurn == X, + not(won(O)), if (boardEmpty) StartInCorner else if (canWin) Win else if (canBlock) Block else if (canTakeCenter) TakeCenter else if (canSetupWin) SetupWin else - MoveToEmpty("X"), - nextTurn' = "O", + MoveToEmpty(X), + nextTurn' = O, } action MoveO = all { - nextTurn == "O", - not(won("X")), - MoveToEmpty("O"), - nextTurn' = "X", + nextTurn == O, + not(won(X)), + MoveToEmpty(O), + nextTurn' = X, } action init = all { // X always goes first - nextTurn' = "X", + nextTurn' = X, // Every space in the board starts blank - board' = 1.to(3).mapBy(_ => 1.to(3).mapBy(_ => "_")), + board' = 1.to(3).mapBy(_ => 1.to(3).mapBy(_ => Empty)), } /// Either X or O will make a move, depending on the value of `nextTurn` @@ -150,10 +162,10 @@ module tictactoe { /* Invariants */ /// X has not won. This does not hold, as X wins most of the times. - val XHasNotWon = not(won("X")) + val XHasNotWon = not(won(X)) /// O has not won. This should hold, as O can only achieve a draw. - val OHasNotWon = not(won("O")) + val OHasNotWon = not(won(O)) /// It's not a stalemate if one player has won or the board is not filled /// Check with `quint run --invariant=NotStalemate tictactoe.qnt` @@ -166,5 +178,5 @@ module tictactoe { /// This is not always true, as if O picks the right moves, the game will /// result in a stalemate. - temporal XMustEventuallyWin = eventually(won("X")) + temporal XMustEventuallyWin = eventually(won(X)) } diff --git a/examples/puzzles/tictactoe/tictactoe.tla b/examples/games/tictactoe/tictactoe.tla similarity index 100% rename from examples/puzzles/tictactoe/tictactoe.tla rename to examples/games/tictactoe/tictactoe.tla diff --git a/examples/language-features/counters.qnt b/examples/language-features/counters.qnt index 4dd254b7e..a316a9e05 100644 --- a/examples/language-features/counters.qnt +++ b/examples/language-features/counters.qnt @@ -80,10 +80,10 @@ module counters { // this tests for a failing condition run failingTest = { init - .then(10.reps(_ => all { + .then(all { n == 0, step, - })) + }) .fail() } diff --git a/examples/language-features/instances.qnt b/examples/language-features/instances.qnt index e46043a44..34ce66d9d 100644 --- a/examples/language-features/instances.qnt +++ b/examples/language-features/instances.qnt @@ -7,6 +7,13 @@ module A { pure def g(b) = not(b) } +module withVar { + const N: int + var counter: int + + action init = counter' = 0 +} + module instances { pure val MyY = true pure val z = "world" @@ -24,6 +31,16 @@ module instances { // the above is equivalent to TLA+'s instance: // A2 == INSTANCE A WITH x <- 15, y <- MyY - action init = true - action step = true + // module withVar has state variables + import withVar(N=1) as V1 + import withVar(N=2) as V2 + + action init = all { V1::init, V2::init } + action step = all { + V1::counter' = V1::counter + 1, + V2::counter' = V2::counter + 2, + } + + // The two variables should increment independently + val inv = V1::counter == 0 or V2::counter > V1::counter } diff --git a/examples/language-features/option.qnt b/examples/language-features/option.qnt index 1be3c5801..23e822872 100644 --- a/examples/language-features/option.qnt +++ b/examples/language-features/option.qnt @@ -1,42 +1,64 @@ module option { // A demonstration of sum types, specifying an option type. - // An option type for int values. - // Polymorphic sum types are not yet supported: https://github.com/informalsystems/quint/issues/1073 - type Vote_option = + // A polymorphic option type + type Option[a] = + | Some(a) | None - | Some(int) - var votes: List[Vote_option] + // `o.optionMap(f)` is `Some(f(v))` if `o = Some(v)` or `None` of `o = None` + def optionMap(o: Option[a], f: a => b): Option[b] = + match o { + | Some(x) => Some(f(x)) + | None => None + } + + // `o.getOr(v)` is `x` or `Some(x) = o` or `v` if `o = None` + def getOr(o: Option[a], default: a): a = + match o { + | Some(x) => x + | None => default + } + + var votes: List[Option[int]] var outcome: int - action Init = all { + action init = all { votes' = [], outcome' = 0 } - action Vote(v) = { + action vote(v) = { votes' = votes.append(Some(v)) } - action Unvote(i) = all { - votes[i] != None, + action incrVote(i, n) = { + val vote0 = votes[i] + val vote1 = vote0.optionMap(x => x + n) + votes' = votes.replaceAt(i, vote1) + } + + action unvote(i) = all { votes' = votes.replaceAt(i, None), } - val SumVotes = - votes.foldl(0, (sum, vote) => match vote { - | Some(v) => sum + v - | None => sum - } - ) + val sumVotes = + votes.foldl(0, (sum, v) => v.getOr(0) + sum) - action Next = all { + action step = all { any { - nondet v = oneOf(Int); Vote(v), - nondet i = oneOf(votes.indices()); Unvote(i), + nondet v = oneOf(0.to(5)); vote(v), + all { + votes.length() > 0, + nondet i = oneOf(votes.indices()); unvote(i), + }, + all { + votes.length() > 0, + nondet i = oneOf(votes.indices()); nondet v = oneOf(0.to(5)) incrVote(i, v), + } + }, - outcome' = SumVotes + outcome' = sumVotes } run matchWithDefaultTest = { diff --git a/examples/spells/BoundedUInt.qnt b/examples/spells/BoundedUInt.qnt index f818fee4d..5203b194c 100644 --- a/examples/spells/BoundedUInt.qnt +++ b/examples/spells/BoundedUInt.qnt @@ -8,258 +8,171 @@ module BoundedUInt { /// The largest value that can be represented by this integer type. pure val MAX = (2^BITS) - 1 - /// Record-representation of an unsigned bounded integer. - /// If the `error` field is nonempty, the record represents an exception of some - /// sort happening during computation, such as an overflow. - /// Otherwise, the record represents the integer `v`, such that `MIN <= v <= MAX`. - /// TODO: Replace with an option type, once those are implemented. - type UIntT = { v: int, error: str } - - /// Constructs a bounded unsigned integer of type `UIntT` from a value `x` of type `int`. - /// If `x` lies outside the `[MIN, MAX]` interval, - /// the error field will be nonempty. - pure def UInt(x: int): UIntT = { - v: x, - error: - if (MIN <= x and x <= MAX) "" - else "out of range" - } - - /// Given a bounded unsigned integer `x`, returns - /// true iff `x.v` lies in the `[MIN, MAX]` interval. - pure def isInRange(x: UIntT): bool = and { - x.v >= MIN, - x.v <= MAX + /// Representation of an unsigned, bounded integer. + /// + /// - `Ok(v)` represents the integer `v`, such that `MIN <= v <= MAX`. + /// - `Err(msg)` holds a message explaining the out of bounds error. + /// + /// NOTE: values of this type must only be constructed using `UInt`, + /// and never via `Ok` or `Err` directly. + // TODO: Replace with polymorphic result type, once that is available + // See https://github.com/informalsystems/quint/issues/1073 + type UIntT = Ok(int) | Err(str) + + /// Given an integer `x`, returns true iff `x` lies in the `[MIN, MAX]` interval. + pure def isInRange(x: int): bool = MIN <= x and x <= MAX + + /// `UInt(x)` is a bounded unsigned integer if `x` is inside the `[MIN, MAX]` interval, + /// otherwise it is an `"out of range"` error. + pure def UInt(x: int): UIntT = if (isInRange(x)) Ok(x) else Err("out of range") + + /// `u.bind(x => f(x))` is `f(x)` iff `u` is `Ok(x)`, i.e., if `u` is a valid bounded int wrapping `x`, + /// otherwise, when `u` is `Err(msg)`, it is `u`. + /// + /// ## Example + /// + /// ``` + /// def checkedIncr(u: UintT): UintT = checkedAdd(u, UIntT(1)) + /// run incr_UintT_twice_test = assert(UInt(0).bind(checkedIncr).bind(checkedIncr) = UInt(2)) + /// ``` + def bind(u: UIntT, f: (int => UIntT)): UIntT = match u { + | Ok(i) => f(i) + | Err(_) => u } - /// Given a bounded unsigned integer `x`, returns - /// true iff `x.v` lies in the `[MIN, MAX]` interval, and `x.error` is empty. - pure def isValid(x: UIntT): bool = and { - x.error == "", - isInRange(x) - } - - /// Given a (T,T) => T operation `op`, which assumes its inputs are valid (w.r.t. `isValid`), - /// and two T-typed values, l and r, returns op(l,r) iff l and r are both valid. Otheriwse, - /// it returns some arbitrary invalid value. - pure def wrapErrorBin(lhs: UIntT, rhs: UIntT, op: (UIntT, UIntT) => UIntT): UIntT = - if (not(isValid(lhs))) lhs - else if (not(isValid(rhs))) rhs - else op(lhs, rhs) + /// `f.app(u, v, msg)` is `UInt(f(x,y))` if `u` is `Ok(x)` and `v` is `Ok(y)`. + /// If `UInt(f(x,y))` is out of range, it is `Err(msg)`. + pure def app(op: (int, int) => int, lhs: UIntT, rhs:UIntT, errMsg: str): UIntT = + lhs.bind(x => rhs.bind(y => + val res = op(x, y) + if (isInRange(res)) Ok(res) else Err(errMsg))) /// Computes the absolute difference between lhs and rhs. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def absDiffUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: if (res < 0) -res else res, - error: "" - } + pure def absDiff(lhs: UIntT, rhs: UIntT): UIntT = { + ((x, y) => { + val res = x - y + if (res < 0) -res else res + }).app(lhs, rhs, + "impossible") } - /// Computes the absolute difference between lhs and rhs. - pure def absDiff(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, absDiffUnsafe) - //////////////////////// // CHECKED OPERATIONS // //////////////////////// - /// Unsafe checked integer addition. - /// Computes `lhs + rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v + rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked integer addition. - /// Computes `lhs + rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedAddUnsafe) - - /// Unsafe checked integer subtraction. - /// Computes `lhs - rhs`, setting the error field to "underflow" if underflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: res, - error: if (res < MIN) "underflow" else "" - } - } + // TODO: In the following we have to eta-expand calls to `ifoo` builtins + // due to https://github.com/informalsystems/quint/issues/1332 + // We should simplify those once this issue with the simulator is fixed. + + /// Checked integer addition. + /// Errors with "overflow" + pure def checkedAdd(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => iadd(x,y)).app(lhs, rhs, "overflow") + + /// Checked integer subtraction. + /// Errors with "underflow". + pure def checkedSub(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => isub(x,y)).app(lhs, rhs, "underflow") + + /// Checked integer multiplication. + /// Errors with "overflow". + pure def checkedMul(lhs: UIntT, rhs: UIntT): UIntT = ((x,y) => imul(x,y)).app(lhs, rhs, "overflow") + + /// Checked integer division. + /// Errors with "division by zero". + pure def checkedDiv(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (r == 0) + Err("division by zero") + else + Ok(l / r))) + + /// Checked integer modulo. + /// Errors with "division by zero". + pure def checkedRem(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (r == 0) + Err("division by zero") + else + Ok(l % r))) + + /// Checked exponentiation. + /// Errors with "overflow". + pure def checkedPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + ((x,y) => ipow(x,y)).app(lhs, rhs, "overflow"))) - /// Checked integer subtraction. - /// Computes `lhs - rhs`, setting the error field to "underflow" if underflow occurred. - pure def checkedSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedSubUnsafe) - - /// Unsafe checked integer multiplication. - /// Computes `lhs * rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v * rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked integer multiplication. - /// Computes `lhs * rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedMulUnsafe) - - /// Unsafe checked integer division. - /// Computes `lhs / rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedDivUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (rhs.v == 0) { v: 0, error: "division by zero" } - else { v: lhs.v / rhs.v, error: "" } - - /// Checked integer division. - /// Computes `lhs / rhs`, setting the error field to "division by zero" if `rhs.v == 0`. - pure def checkedDiv(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedDivUnsafe) - - /// Unsafe checked integer remainder. - /// Computes `lhs % rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedRemUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (rhs.v == 0) { v: 0, error: "division by zero" } - else { v: lhs.v % rhs.v, error: "" } - - /// Checked integer remainder. - /// Computes `lhs % rhs`. If `rhs.v == 0` the error field is set to "division by zero" and the value is arbitrary. - pure def checkedRem(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedRemUnsafe) - - /// Unsafe checked exponentiation. - /// Computes `lhs ^ rhs`, setting the error field to "overflow" if overflow occurred. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def checkedPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - val res = lhs.v ^ rhs.v - { - v: res, - error: if (res > MAX) "overflow" else "" - } - } - - /// Checked exponentiation. - /// Computes `lhs ^ rhs`, setting the error field to "overflow" if overflow occurred. - pure def checkedPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, checkedPowUnsafe) /////////////////////////// // SATURATING OPERATIONS // /////////////////////////// - /// Unsafe saturating integer addition. + /// Saturating integer addition. /// Computes `lhs + rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v + rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } - - /// Saturating integer addition. - /// Computes `lhs + rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingAddUnsafe) - - /// Unsafe saturating integer subtraction. - /// Computes `lhs - rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - { - v: if (res > MIN) res else MIN, - error: "" - } - } + pure def saturatingAdd(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x + y + if (res < MAX) res else MAX) + .app(lhs, rhs, "impossible") - /// Saturating integer subtraction. + /// Saturating integer subtraction. /// Computes `lhs - rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingSubUnsafe) - - /// Unsafe saturating integer multiplication. - /// Computes `lhs * rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v * rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } + pure def saturatingSub(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x - y + if (res > MIN) res else MIN) + .app(lhs, rhs, "impossible") - /// Saturating integer subtraction. + /// Saturating integer subtraction. /// Computes `lhs * rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingMulUnsafe) - - /// Unsafe saturating exponentiation. - /// Computes `lhs ^ rhs`, saturating at the numeric bounds instead of overflowing. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def saturatingPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - val res = lhs.v ^ rhs.v - { - v: if (res < MAX) res else MAX, - error: "" - } - } - + pure def saturatingMul(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => + val res = x * y + if (res < MAX) res else MAX) + .app(lhs, rhs, "impossible") - /// Saturating exponentiation. + /// Saturating exponentiation. /// Computes `lhs ^ rhs`, saturating at the numeric bounds instead of overflowing. - pure def saturatingPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, saturatingPowUnsafe) + pure def saturatingPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + val res = l ^ r + Ok(if (res < MAX) res else MAX))) ///////////////////////// // WRAPPING OPERATIONS // ///////////////////////// - /// Unsafe wrapping integer addition. - /// Computes `lhs + rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingAddUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - { - v: (lhs.v + rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping integer addition. /// Computes `lhs + rhs`, wrapping around at the boundary of the type. - pure def wrappingAdd(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingAddUnsafe) + pure def wrappingAdd(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => (x + y) % (MAX + 1)).app(lhs, rhs, "impossible") - /// Unsafe wrapping integer subtraction. - /// Computes `lhs - rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingSubUnsafe(lhs: UIntT, rhs: UIntT): UIntT = { - val res = lhs.v - rhs.v - val adjusted = if (res < MIN) res + (MAX + 1) else res - { - v: adjusted % (MAX + 1), - error: "" - } + pure def wrappingSubInt(x: int, y: int): int = { + val res = x - y + val adjusted = if (res < MIN) (res + (MAX + 1)) else res + adjusted % (MAX + 1) } /// Wrapping integer subtraction. /// Computes `lhs - rhs`, wrapping around at the boundary of the type. - pure def wrappingSub(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingSubUnsafe) + pure def wrappingSub(lhs: UIntT, rhs: UIntT): UIntT = wrappingSubInt.app(lhs, rhs, "impossible") - /// Unsafe wrapping integer multiplication. - /// Computes `lhs * rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingMulUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - { - v: (lhs.v * rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping integer multiplication. /// Computes `lhs * rhs`, wrapping around at the boundary of the type. - pure def wrappingMul(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingMulUnsafe) + pure def wrappingMul(lhs: UIntT, rhs: UIntT): UIntT = + ((x, y) => (x * y) % (MAX + 1)).app(lhs, rhs, "impossible") /// Wrapping integer division. /// Computes `lhs / rhs`. Wrapped division on unsigned types is just normal division. @@ -273,19 +186,16 @@ module BoundedUInt { /// This operator exists, so that all operations are accounted for in the wrapping operations. pure def wrappingRem(lhs: UIntT, rhs: UIntT): UIntT = checkedRem(lhs, rhs) - /// Unsafe wrapping exponentiation. - /// Computes `lhs ^ rhs`, wrapping around at the boundary of the type. - /// Assumes lhs and rhs are valid (w.r.t. `isValid`). - pure def wrappingPowUnsafe(lhs: UIntT, rhs: UIntT): UIntT = - if (lhs.v == rhs.v and lhs.v == 0) { v: 1, error: "undefined"} - else { - v: (lhs.v ^ rhs.v) % (MAX + 1), - error: "" - } - /// Wrapping exponentiation. /// Computes `lhs ^ rhs`, wrapping around at the boundary of the type. - pure def wrappingPow(lhs: UIntT, rhs: UIntT): UIntT = wrapErrorBin(lhs, rhs, wrappingPowUnsafe) + pure def wrappingPow(lhs: UIntT, rhs: UIntT): UIntT = + lhs.bind( + l => rhs.bind( + r => + if (l == r and l == 0) + Err("undefined") + else + Ok((l ^ r) % (MAX + 1)))) } module BoundedUInt_Test { @@ -300,99 +210,99 @@ module BoundedUInt_Test { // Checked add pure val CAddInvsTest = and { - assert(checkedAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(checkedAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(checkedAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(checkedAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(checkedAdd(UInt(1), UInt(MAX)) == {v: MAX + 1, error: "overflow"}), - assert(checkedAdd(UInt(MAX - 1), UInt(MAX)) == {v: 2 * MAX - 1, error: "overflow"}), - assert(checkedAdd(UInt(MAX), UInt(MAX)) == {v: 2 * MAX, error: "overflow"}), - assert(checkedAdd(UInt(MAX), UInt(MAX + 1)).error == "out of range"), + assert(checkedAdd(UInt(0), UInt(0)) == Ok(0)), + assert(checkedAdd(UInt(1), UInt(0)) == Ok(1)), + assert(checkedAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(checkedAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(checkedAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(checkedAdd(UInt(1), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX - 1), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX), UInt(MAX)) == Err("overflow")), + assert(checkedAdd(UInt(MAX), UInt(MAX + 1)) == Err("out of range")), } // Checked sub pure val CSubInvsTest = and { - assert(checkedSub(UInt(0), UInt(0)) == {v: 0 , error: ""}), - assert(checkedSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(checkedSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(checkedSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedSub(UInt(0), UInt(MAX)) == {v: -MAX, error: "underflow"}), - assert(checkedSub(UInt(1), UInt(MAX)) == {v: -(MAX - 1), error: "underflow"}), - assert(checkedSub(UInt(MAX - 1), UInt(MAX)) == {v: -1, error: "underflow"}), - assert(checkedSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedSub(UInt(MAX + 1), UInt(MAX)).error == "out of range"), + assert(checkedSub(UInt(0), UInt(0)) == Ok(0)), + assert(checkedSub(UInt(1), UInt(0)) == Ok(1)), + assert(checkedSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(checkedSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(checkedSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedSub(UInt(0), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(1), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(MAX - 1), UInt(MAX)) == Err("underflow")), + assert(checkedSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(checkedSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")), } // Checked mul pure val CMulInvsTest = and { - assert(checkedMul(UInt(0), UInt(1)) == {v: 0 , error: ""}), - assert(checkedMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(checkedMul(UInt(MAX - 1), UInt(MAX)) == {v: MAX^2 - MAX, error: "overflow"}), - assert(checkedMul(UInt(MAX), UInt(MAX)) == {v: MAX^2, error: "overflow"}), - assert(checkedMul(UInt(MAX + 1), UInt(MAX)).error == "out of range"), + assert(checkedMul(UInt(0), UInt(1)) == Ok(0)), + assert(checkedMul(UInt(1), UInt(1)) == Ok(1)), + assert(checkedMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(checkedMul(UInt(MAX - 1), UInt(MAX)) == Err("overflow")), + assert(checkedMul(UInt(MAX), UInt(MAX)) == Err("overflow")), + assert(checkedMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")), } // Checked div pure val CDivInvsTest = and { - assert(checkedDiv(UInt(0), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(1), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX - 1), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX), UInt(0)).error == "division by zero"), - assert(checkedDiv(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedDiv(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedDiv(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedDiv(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedDiv(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedDiv(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(MAX - 1), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedDiv(UInt(MAX), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedDiv(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(checkedDiv(UInt(0), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(1), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX - 1), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX), UInt(0)) == Err("division by zero")), + assert(checkedDiv(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedDiv(UInt(0), UInt(1)) == Ok(0)), + assert(checkedDiv(UInt(1), UInt(1)) == Ok(1)), + assert(checkedDiv(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedDiv(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedDiv(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedDiv(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(1), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(MAX - 1), UInt(MAX)) == Ok(0)), + assert(checkedDiv(UInt(MAX), UInt(MAX)) == Ok(1)), + assert(checkedDiv(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Checked rem pure val CRemInvsTest = and { - assert(checkedRem(UInt(0), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(1), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX - 1), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX), UInt(0)).error == "division by zero"), - assert(checkedRem(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(checkedRem(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX - 1), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX), UInt(1)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedRem(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedRem(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedRem(UInt(MAX - 1), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(checkedRem(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedRem(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(checkedRem(UInt(0), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(1), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX - 1), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX), UInt(0)) == Err("division by zero")), + assert(checkedRem(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(checkedRem(UInt(0), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(1), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX - 1), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX), UInt(1)) == Ok(0)), + assert(checkedRem(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedRem(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedRem(UInt(1), UInt(MAX)) == Ok(1)), + assert(checkedRem(UInt(MAX - 1), UInt(MAX)) == Ok(MAX - 1)), + assert(checkedRem(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(checkedRem(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Checked Pow pure val CPowInvsTest = and { - assert(checkedPow(UInt(0), UInt(0)).error == "undefined"), - assert(checkedPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(checkedPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(checkedPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(checkedPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(checkedPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(checkedPow(UInt(MAX), UInt(0)) == {v: 1, error: ""}), - assert(checkedPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(checkedPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(checkedPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(checkedPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(checkedPow(UInt(2), UInt(BITS)) == {v: MAX + 1, error: "overflow"}), - assert(checkedPow(UInt(2), UInt(BITS + 1)) == {v: 2 * MAX + 2, error: "overflow"}), + assert(checkedPow(UInt(0), UInt(0)) == Err("undefined")), + assert(checkedPow(UInt(0), UInt(1)) == Ok(0)), + assert(checkedPow(UInt(1), UInt(0)) == Ok(1)), + assert(checkedPow(UInt(1), UInt(1)) == Ok(1)), + assert(checkedPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(checkedPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(checkedPow(UInt(MAX), UInt(0)) == Ok(1)), + assert(checkedPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(checkedPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(checkedPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(checkedPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(checkedPow(UInt(2), UInt(BITS)) == Err("overflow")), + assert(checkedPow(UInt(2), UInt(BITS + 1)) == Err("overflow")), } //////////////// @@ -401,61 +311,61 @@ module BoundedUInt_Test { // Saturating add pure val SAddInvsTest = and { - assert(saturatingAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(saturatingAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(saturatingAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(saturatingAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingAdd(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingAdd(UInt(0), UInt(0)) == Ok(0)), + assert(saturatingAdd(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(saturatingAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(saturatingAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX), UInt(MAX)) == Ok(MAX)), + assert(saturatingAdd(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating sub pure val SSubInvsTest = and { - assert(saturatingSub(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingSub(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(saturatingSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(saturatingSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(saturatingSub(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX - 1), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingSub(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingSub(UInt(0), UInt(0)) == Ok(0)), + assert(saturatingSub(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingSub(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(saturatingSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(saturatingSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(saturatingSub(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(1), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX - 1), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(saturatingSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating mul pure val SMulInvsTest = and { - assert(saturatingMul(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(saturatingMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(saturatingMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(saturatingMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX), UInt(MAX)) == {v: MAX, error: ""}), - assert(saturatingMul(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(saturatingMul(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingMul(UInt(1), UInt(1)) == Ok(1)), + assert(saturatingMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(saturatingMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(saturatingMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX), UInt(MAX)) == Ok(MAX)), + assert(saturatingMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Saturating pow pure val SPowInvsTest = and { - assert(saturatingPow(UInt(0), UInt(0)).error == "undefined"), - assert(saturatingPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(saturatingPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(saturatingPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(saturatingPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(saturatingPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(saturatingPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS)) == {v: MAX, error: ""}), - assert(saturatingPow(UInt(2), UInt(BITS + 1)) == {v: MAX, error: ""}), + assert(saturatingPow(UInt(0), UInt(0)) == Err("undefined")), + assert(saturatingPow(UInt(0), UInt(1)) == Ok(0)), + assert(saturatingPow(UInt(1), UInt(0)) == Ok(1)), + assert(saturatingPow(UInt(1), UInt(1)) == Ok(1)), + assert(saturatingPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(saturatingPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(saturatingPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(saturatingPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(saturatingPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(saturatingPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(saturatingPow(UInt(2), UInt(BITS)) == Ok(MAX)), + assert(saturatingPow(UInt(2), UInt(BITS + 1)) == Ok(MAX)), } ////////////// @@ -464,47 +374,47 @@ module BoundedUInt_Test { // Wrapping add pure val WAddInvsTest = and { - assert(wrappingAdd(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingAdd(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(1)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(wrappingAdd(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingAdd(UInt(1), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingAdd(UInt(MAX - 1), UInt(MAX)) == {v: MAX - 2, error: ""}), - assert(wrappingAdd(UInt(MAX), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(wrappingAdd(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingAdd(UInt(0), UInt(0)) == Ok(0)), + assert(wrappingAdd(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingAdd(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(wrappingAdd(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(wrappingAdd(UInt(MAX), UInt(1)) == Ok(0)), + assert(wrappingAdd(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(wrappingAdd(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(wrappingAdd(UInt(1), UInt(MAX)) == Ok(0)), + assert(wrappingAdd(UInt(MAX - 1), UInt(MAX)) == Ok(MAX - 2)), + assert(wrappingAdd(UInt(MAX), UInt(MAX)) == Ok(MAX - 1)), + assert(wrappingAdd(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping sub pure val WSubInvsTest = and { - assert(wrappingSub(UInt(0), UInt(0)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingSub(UInt(0), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(MAX - 1), UInt(0)) == {v: MAX - 1, error: ""}), - assert(wrappingSub(UInt(MAX), UInt(0)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(MAX + 1), UInt(0)).error == "out of range"), - assert(wrappingSub(UInt(0), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingSub(UInt(1), UInt(MAX)) == {v: 2, error: ""}), - assert(wrappingSub(UInt(MAX - 1), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingSub(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingSub(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingSub(UInt(0), UInt(0)) == Ok(0)), + assert(wrappingSub(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingSub(UInt(0), UInt(1)) == Ok(MAX)), + assert(wrappingSub(UInt(1), UInt(1)) == Ok(0)), + assert(wrappingSub(UInt(MAX - 1), UInt(0)) == Ok(MAX - 1)), + assert(wrappingSub(UInt(MAX), UInt(0)) == Ok(MAX)), + assert(wrappingSub(UInt(MAX + 1), UInt(0)) == Err("out of range")), + assert(wrappingSub(UInt(0), UInt(MAX)) == Ok(1)), + assert(wrappingSub(UInt(1), UInt(MAX)) == Ok(2)), + assert(wrappingSub(UInt(MAX - 1), UInt(MAX)) == Ok(MAX)), + assert(wrappingSub(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(wrappingSub(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping mul pure val WMulInvsTest = and { - assert(wrappingMul(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(wrappingMul(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(wrappingMul(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(wrappingMul(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingMul(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(wrappingMul(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingMul(UInt(1), UInt(MAX)) == {v: MAX, error: ""}), - assert(wrappingMul(UInt(MAX - 1), UInt(MAX)) == {v: 2, error: ""}), - assert(wrappingMul(UInt(MAX), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingMul(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(wrappingMul(UInt(0), UInt(1)) == Ok(0)), + assert(wrappingMul(UInt(1), UInt(1)) == Ok(1)), + assert(wrappingMul(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(wrappingMul(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(wrappingMul(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(wrappingMul(UInt(0), UInt(MAX)) == Ok(0)), + assert(wrappingMul(UInt(1), UInt(MAX)) == Ok(MAX)), + assert(wrappingMul(UInt(MAX - 1), UInt(MAX)) == Ok(2)), + assert(wrappingMul(UInt(MAX), UInt(MAX)) == Ok(1)), + assert(wrappingMul(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } // Wrapping div == checked div @@ -512,18 +422,18 @@ module BoundedUInt_Test { // Wrapping Pow pure val WPowInvsTest = and { - assert(wrappingPow(UInt(0), UInt(0)).error == "undefined"), - assert(wrappingPow(UInt(0), UInt(1)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(1), UInt(0)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(1), UInt(1)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(MAX - 1), UInt(1)) == {v: MAX - 1, error: ""}), - assert(wrappingPow(UInt(MAX), UInt(1)) == {v: MAX, error: ""}), - assert(wrappingPow(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(wrappingPow(UInt(0), UInt(MAX)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(1), UInt(MAX)) == {v: 1, error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS - 1)) == {v: 2^(BITS - 1), error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS)) == {v: 0, error: ""}), - assert(wrappingPow(UInt(2), UInt(BITS + 1)) == {v: 0, error: ""}), + assert(wrappingPow(UInt(0), UInt(0)) == Err("undefined")), + assert(wrappingPow(UInt(0), UInt(1)) == Ok(0)), + assert(wrappingPow(UInt(1), UInt(0)) == Ok(1)), + assert(wrappingPow(UInt(1), UInt(1)) == Ok(1)), + assert(wrappingPow(UInt(MAX - 1), UInt(1)) == Ok(MAX - 1)), + assert(wrappingPow(UInt(MAX), UInt(1)) == Ok(MAX)), + assert(wrappingPow(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(wrappingPow(UInt(0), UInt(MAX)) == Ok(0)), + assert(wrappingPow(UInt(1), UInt(MAX)) == Ok(1)), + assert(wrappingPow(UInt(2), UInt(BITS - 1)) == Ok(2^(BITS - 1))), + assert(wrappingPow(UInt(2), UInt(BITS)) == Ok(0)), + assert(wrappingPow(UInt(2), UInt(BITS + 1)) == Ok(0)), } ////////////// @@ -531,16 +441,16 @@ module BoundedUInt_Test { ////////////// pure val AbsDiffTest = and { - assert(absDiff(UInt(0), UInt(1)) == {v: 1, error: ""}), - assert(absDiff(UInt(1), UInt(1)) == {v: 0, error: ""}), - assert(absDiff(UInt(MAX - 1), UInt(1)) == {v: MAX - 2, error: ""}), - assert(absDiff(UInt(MAX), UInt(1)) == {v: MAX - 1, error: ""}), - assert(absDiff(UInt(MAX + 1), UInt(1)).error == "out of range"), - assert(absDiff(UInt(0), UInt(MAX)) == {v: MAX, error: ""}), - assert(absDiff(UInt(1), UInt(MAX)) == {v: MAX - 1, error: ""}), - assert(absDiff(UInt(MAX - 1), UInt(MAX)) == {v: 1, error: ""}), - assert(absDiff(UInt(MAX), UInt(MAX)) == {v: 0, error: ""}), - assert(absDiff(UInt(MAX + 1), UInt(MAX)).error == "out of range") + assert(absDiff(UInt(0), UInt(1)) == Ok(1)), + assert(absDiff(UInt(1), UInt(1)) == Ok(0)), + assert(absDiff(UInt(MAX - 1), UInt(1)) == Ok(MAX - 2)), + assert(absDiff(UInt(MAX), UInt(1)) == Ok(MAX - 1)), + assert(absDiff(UInt(MAX + 1), UInt(1)) == Err("out of range")), + assert(absDiff(UInt(0), UInt(MAX)) == Ok(MAX)), + assert(absDiff(UInt(1), UInt(MAX)) == Ok(MAX - 1)), + assert(absDiff(UInt(MAX - 1), UInt(MAX)) == Ok(1)), + assert(absDiff(UInt(MAX), UInt(MAX)) == Ok(0)), + assert(absDiff(UInt(MAX + 1), UInt(MAX)) == Err("out of range")) } } diff --git a/examples/spells/basicSpells.qnt b/examples/spells/basicSpells.qnt index 40764b81b..cc3884728 100644 --- a/examples/spells/basicSpells.qnt +++ b/examples/spells/basicSpells.qnt @@ -140,4 +140,30 @@ module basicSpells { assert(m.mapRemoveAll(Set(5, 7)) == Map(3 -> 4)), assert(m.mapRemoveAll(Set(5, 99999)) == Map(3 -> 4, 7 -> 8)), } + + /// Get the set of values of a map. + /// + /// - @param __map a map from type a to type b + /// - @returns the set of all values in the map + pure def values(__map: a -> b): Set[b] = { + __map.keys().map(k => __map.get(k)) + } + + run valuesTest = all { + assert(values(Map()) == Set()), + assert(values(Map(1 -> 2, 2 -> 3)) == Set(2, 3)), + assert(values(Map(1 -> 2, 2 -> 3, 3 -> 2)) == Set(2, 3)), + } + + /// Whether a set is empty + /// + /// - @param s a set of any type + /// - @returns true iff the set is the empty set + pure def empty(s: Set[a]): bool = s == Set() + + run emptyTest = all { + assert(empty(Set()) == true), + assert(empty(Set(1, 2)) == false), + assert(empty(Set(Set())) == false), + } } diff --git a/examples/spells/commonSpells.qnt b/examples/spells/commonSpells.qnt index 7205ec954..53b124ff9 100644 --- a/examples/spells/commonSpells.qnt +++ b/examples/spells/commonSpells.qnt @@ -17,4 +17,27 @@ module commonSpells { assert(setSum(2.to(4)) == 9), assert(setSum(Set(-4, 4, 5)) == 5), } -} \ No newline at end of file + + + /// Convert a map into a set of pairs coordinating its keys and values + /// + /// - @param __map a map + /// - @returns the set of pairs coordinating the map's keys with its values + /// + /// ### Examples + /// + /// ``` + /// val accountValues: Map[str, int] = Map("a" -> 1, "b" -> 1, "c" -> "1") + /// val sumOfValues: int = accountValues.mapToSet().fold(0, (acc, kv) => acc + kv._2) + /// assert(sumOfValues == 3) + /// ``` + pure def mapToSet(__map: a -> b): Set[(a, b)] = { + __map.keys().fold(Set(), (__acc, __k) => __acc.union(Set((__k, __map.get(__k))))) + } + + run mapToSetTest = all { + assert(mapToSet(Map()) == Set()), + assert(mapToSet(Map(1 -> 2, 2 -> 3)) == Set((1, 2), (2, 3))), + assert(Map("a" -> 1, "b" -> 1, "c" -> 1).mapToSet().fold(0, (__acc, __kv) => __acc + __kv._2) == 3), + } +} diff --git a/examples/spells/rareSpells.qnt b/examples/spells/rareSpells.qnt index f5a829403..9c54a8982 100644 --- a/examples/spells/rareSpells.qnt +++ b/examples/spells/rareSpells.qnt @@ -9,6 +9,26 @@ * so the others would see how to use it. */ module rareSpells { + + /// The type of orderings between comparable things + // Follows https://hackage.haskell.org/package/base-4.19.0.0/docs/Data-Ord.html#t:Ordering + // and we think there are likely benefits to using 3 constant values rather than the more + // common integer range in Apalache. + type Ordering = + | EQ + | LT + | GT + + /// Comparison of integers + pure def intCompare(__a: int, __b:int): Ordering = { + if (__a < __b) + { LT } + else if (__a > __b) + { GT } + else + { EQ } + } + /// /// Compute the sum of the values over all entries in a map. /// @@ -23,4 +43,68 @@ module rareSpells { assert(2.to(5).mapBy(i => i * 2).mapValuesSum() == 28), assert(Map(2 -> -4, 4 -> 2).mapValuesSum() == -2), } -} \ No newline at end of file + + /// Assuming `__l` is sorted according to `__cmp`, returns a list with the element `__x` + /// insterted in order. + /// + /// If `__l` is not sorted, `__x` will be inserted after the first element less than + /// or equal to it. + /// + /// - @param __l a sorted list + /// - @param __x an element to be inserted + /// - @param __cmp an operator defining an `Ordering` of the elemnts of type `a` + /// - @returns a sorted list that includes `__x` + pure def sortedListInsert(__l: List[a], __x: a, __cmp: (a, a) => Ordering): List[a] = { + // We need to track whether __x has been inserted, and the accumulator for the new list + val __init = { is_inserted: false, acc: List() } + + val __result = __l.foldl(__init, (__state, __y) => + if (__state.is_inserted) + { ...__state, acc: __state.acc.append(__y) } + else + match __cmp(__x, __y) { + | GT => { ...__state, acc: __state.acc.append(__y) } + | _ => { is_inserted: true, acc: __state.acc.append(__x).append(__y) } + }) + + if (not(__result.is_inserted)) + // If __x was not inserted, it was GT than every other element, so it goes at the end + __result.acc.append(__x) + else + __result.acc + } + + run sortedListInsertTest = all { + assert(List().sortedListInsert(3, intCompare) == List(3)), + assert(List(1,2,4).sortedListInsert(3, intCompare) == List(1,2,3,4)), + assert(List(4,1,2).sortedListInsert(3, intCompare) == List(3,4,1,2)), + } + + //// Returns a list of all elements of a set. + //// The ordering will be arbitrary. + //// + //// - @param __set a set + //// - @param __cmp an ordering over the elements of the set + //// - @returns a sorted list of all elements of __set + pure def toList(__set: Set[a], __cmp: (a, a) => Ordering): List[a] = { + __set.fold(List(), (__l, __e) => __l.sortedListInsert(__e, __cmp)) + } + + //// Returns a set of the elements in the list. + //// + //// - @param __list a list + //// - @returns a set of the elements in __list + pure def toSet(__list: List[a]): Set[a] = { + __list.foldl(Set(), (__s, __e) => __s.union(Set(__e))) + } + + run toListAndSetTest = + all { + assert(Set(3, 2, 1).toList(intCompare).toSet() == Set(1, 2, 3)), + assert(List(2,3,1).toSet() == Set(1, 2, 3)), + assert(List(2,3,1).toSet() == List(3,2,1).toSet()), + assert(Set(2,3,1).toList(intCompare) == Set(3,1,2).toList(intCompare)), + assert(toList(Set(), intCompare) == List()), + assert(toSet(List()) == Set()) + } +} diff --git a/logos/quint-logo-dark.png b/logos/quint-logo-dark.png new file mode 100644 index 000000000..68ecce9ba Binary files /dev/null and b/logos/quint-logo-dark.png differ diff --git a/logos/quint-logo-dark.svg b/logos/quint-logo-dark.svg new file mode 100644 index 000000000..ce1ea6852 --- /dev/null +++ b/logos/quint-logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/quint-logo-light.png b/logos/quint-logo-light.png new file mode 100644 index 000000000..3346cdb9f Binary files /dev/null and b/logos/quint-logo-light.png differ diff --git a/logos/quint-logo-light.svg b/logos/quint-logo-light.svg new file mode 100644 index 000000000..199760f66 --- /dev/null +++ b/logos/quint-logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/vienna-business-agency.png b/logos/vienna-business-agency.png new file mode 100644 index 000000000..ed8e1e6bb Binary files /dev/null and b/logos/vienna-business-agency.png differ diff --git a/quint/apalache-tests.md b/quint/apalache-tests.md index 1ffc501d2..f377a9e77 100644 --- a/quint/apalache-tests.md +++ b/quint/apalache-tests.md @@ -219,3 +219,185 @@ An example execution: __saved_n: 1, n: 1 ``` + +## Compiling to TLA+ + +### Test that we can compile to TLA+ of the expected form + + +``` +quint compile --target tlaplus ./testFixture/ApalacheCompilation.qnt +``` + + +``` +-------------------------- MODULE ApalacheCompilation -------------------------- + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants + +VARIABLE + (* + @type: Int; + *) + x + +(* + @type: (() => A(UNIT) | B(Int)); +*) +A == Variant("A", "U_OF_UNIT") + +(* + @type: ((Int) => A(UNIT) | B(Int)); +*) +B(__BParam_31) == Variant("B", __BParam_31) + +(* + @type: ((a) => a); +*) +foo_bar(id__123_35) == id__123_35 + +(* + @type: (() => Int); +*) +importedValue == 0 + +(* + @type: (() => Int); +*) +ApalacheCompilation_ModuleToInstantiate_C == 0 + +(* + @type: (() => Bool); +*) +altInit == x' := 0 + +(* + @type: (() => Bool); +*) +step == x' := (x + 1) + +(* + @type: (() => Bool); +*) +altStep == x' := (x + 0) + +(* + @type: (() => Bool); +*) +inv == x >= 0 + +(* + @type: (() => Bool); +*) +altInv == x >= 0 + +(* + @type: (() => Int); +*) +ApalacheCompilation_ModuleToInstantiate_instantiatedValue == + ApalacheCompilation_ModuleToInstantiate_C + +(* + @type: (() => Bool); +*) +init == + x' + := (importedValue + + ApalacheCompilation_ModuleToInstantiate_instantiatedValue) + +(* + @type: (() => Bool); +*) +q_step == step + +(* + @type: (() => Bool); +*) +q_init == init + +================================================================================ +``` + +### Test that we can compile to TLA+ of the expected form with CLI configs + +We check that specifying `--init`, `--step`, and `--invariant` work as expected + + +``` +quint compile --target tlaplus \ + --init altInit --step altStep --invariant altInv \ + ./testFixture/ApalacheCompilation.qnt \ + | grep -e q_init -e q_step -e q_inv +``` + + +``` +q_init == altInit +q_step == altStep +q_inv == altInv +``` + +### Test that we can compile to TLA+ of the expected form, specifying `--main` + + +``` +quint compile --target tlaplus --main ModuleToImport ./testFixture/ApalacheCompilation.qnt +``` + + +``` +---------------------------- MODULE ModuleToImport ---------------------------- + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants + +(* + @type: (() => Bool); +*) +step == TRUE + +(* + @type: (() => Int); +*) +importedValue == 0 + +(* + @type: (() => Bool); +*) +init == TRUE + +(* + @type: (() => Bool); +*) +q_init == init + +(* + @type: (() => Bool); +*) +q_step == step + +================================================================================ +``` + +### Test that we can compile a module to TLA+ that instantiates but has no declarations + + + +``` +quint compile --target tlaplus ../examples/classic/distributed/ClockSync/clockSync3.qnt | head +``` + +The compiled module is not empty: + + +``` +------------------------------ MODULE clockSync3 ------------------------------ + +EXTENDS Integers, Sequences, FiniteSets, TLC, Apalache, Variants + +VARIABLE + (* + @type: Int; + *) + clockSync3_clockSync3Spec_time + +``` diff --git a/quint/cli-tests.md b/quint/cli-tests.md index a722e7ce2..8673077ad 100644 --- a/quint/cli-tests.md +++ b/quint/cli-tests.md @@ -99,6 +99,11 @@ This example was pointing to Paxos. Now it does not typecheck. quint typecheck ../examples/language-features/instances.qnt +### OK on run instances + + + quint run ../examples/language-features/instances.qnt --invariant=inv + ### OK on parse instancesFrom @@ -127,12 +132,12 @@ This example was pointing to Paxos. Now it does not typecheck. ### OK on parse TicTacToe - quint parse ../examples/puzzles/tictactoe/tictactoe.qnt + quint parse ../examples/games/tictactoe/tictactoe.qnt ### OK on typecheck TicTacToe - quint typecheck ../examples/puzzles/tictactoe/tictactoe.qnt + quint typecheck ../examples/games/tictactoe/tictactoe.qnt ### OK on parse ics20 bank diff --git a/quint/io-cli-tests.md b/quint/io-cli-tests.md index 994c74d23..da0b56ffb 100644 --- a/quint/io-cli-tests.md +++ b/quint/io-cli-tests.md @@ -24,11 +24,15 @@ We want to ensure we do not throw uncaught exceptions when the input file is doesn't exist. - quint parse ../examples/non-existent.file +``` +quint parse ../examples/non-existent.file +``` - error: file ../examples/non-existent.file does not exist +``` +error: file ../examples/non-existent.file does not exist +``` ### User error on parse with junk after modules @@ -37,14 +41,18 @@ We want to ensure that the parser shows an error, when it detects junk in the end of file. - quint parse ./testFixture/modulesAndJunk.qnt 2>&1 | sed 's#.*quint/\(testFixture\)#Q/\1#g' +``` +quint parse ./testFixture/modulesAndJunk.qnt 2>&1 | sed 's#.*quint/\(testFixture\)#Q/\1#g' +``` - Q/testFixture/modulesAndJunk.qnt:9:1 - error: [QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT} - 9: the parser - ^^^ +``` +Q/testFixture/modulesAndJunk.qnt:9:1 - error: [QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT} +9: the parser + ^^^ - error: parsing failed +error: parsing failed +``` ### User error on parse with invalid input @@ -171,6 +179,38 @@ Trying to unify bool and int error: typechecking failed ``` +## The `compile` commaind + +### Reports in error for invalid `--target` + +We pipe stderr to `tail` here. Following https://stackoverflow.com/a/52575213/1187277 +This is a clean CLI interface error, but we don't want to put the entire output +in the test, lest it require fiddling when unrelated things are updated. + + + +``` +quint compile --target invalidTarget ../examples/language-features/booleans.qnt 2> >(tail -1 >&2) +``` + + +``` +Invalid option for --target: invalidTarget. Valid options: tlaplus, json +``` + + +### Can compile `booleans.qnt` to JSON + + +``` +quint compile --target json ../examples/language-features/booleans.qnt | jq '.modules[0].name' +``` + + +``` +"booleans" +``` + ## Use of `repl`, `test`, and `run` ### Repl loads a file with -r @@ -271,18 +311,12 @@ echo -e "init\nMyF::ExportedBasics::double(2)" | quint -r ../examples/language-f ``` -echo -e "1 +" | quint | tail -n +3 +echo -e "1 +" | quint | grep -o 'syntax error: error: \[QNT000\]' ``` ``` ->>> [DEBUG] generating undefined expr to fill hole in: 1+ -syntax error: error: [QNT000] mismatched input '' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER} - - - - ->>> +syntax error: error: [QNT000] ``` @@ -414,6 +448,40 @@ Use --verbosity=3 to show executions. error: Invariant violated ``` +### Run finds an invariant violation with metadata + +The command `run` finds an invariant violation and outputs metadata for MBT, when given the `--mbt` flag. + + +``` +output=$(quint run --seed=0x308623f2a48e7 --mbt --max-steps=4 \ + --invariant='n < 10' ../examples/language-features/counters.qnt 2>&1) +exit_code=$? +echo "$output" | sed -e 's/([0-9]*ms)/(duration)/g' -e 's#^.*counters.qnt# HOME/counters.qnt#g' +exit $exit_code +``` + + + +``` +An example execution: + +[State 0] { action_taken: "q::init", n: 1, nondet_picks: { } } + +[State 1] { action_taken: "OnPositive", n: 2, nondet_picks: { } } + +[State 2] { action_taken: "OnPositive", n: 3, nondet_picks: { } } + +[State 3] { action_taken: "OnDivByThree", n: 6, nondet_picks: { } } + +[State 4] { action_taken: "OnDivByThree", n: 12, nondet_picks: { } } + +[violation] Found an issue (duration). +Use --seed=0x308623f2a48e7 to reproduce. +Use --verbosity=3 to show executions. +error: Invariant violated +``` + ### Run finds an example The command `run` finds an example. @@ -689,6 +757,115 @@ rm out-itf-example.itf.json ] ``` +### Run outputs ITF with metadata + + +``` +quint run --out-itf=out-itf-mbt-example.itf.json --max-steps=5 --seed=123 \ + --invariant=totalSupplyDoesNotOverflowInv --mbt\ + ../examples/solidity/Coin/coin.qnt +cat out-itf-mbt-example.itf.json | jq '.states[1]' +rm out-itf-mbt-example.itf.json +``` + + +``` +{ + "#meta": { + "index": 1 + }, + "action_taken": "mint", + "balances": { + "#map": [ + [ + "alice", + { + "#bigint": "0" + } + ], + [ + "bob", + { + "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + } + ], + [ + "charlie", + { + "#bigint": "0" + } + ], + [ + "eve", + { + "#bigint": "0" + } + ], + [ + "null", + { + "#bigint": "0" + } + ] + ] + }, + "minter": "bob", + "nondet_picks": { + "amount": { + "tag": "Some", + "value": { + "#bigint": "111009104957917492842738448433884729279015865072041681905260877596484059410831" + } + }, + "eveToBob": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "mintBob": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "mintEve": { + "tag": "None", + "value": { + "#tup": [] + } + }, + "receiver": { + "tag": "Some", + "value": "bob" + }, + "sender": { + "tag": "Some", + "value": "bob" + } + } +} +``` + +### Run without violation outputs ITF + + +``` +quint run --out-itf=out-itf-example.itf.json --max-steps=5 --seed=123 ../examples/solidity/Coin/coin.qnt +cat out-itf-example.itf.json | jq '.states[0]."balances"."#map"[0]' +rm out-itf-example.itf.json +``` + + +``` +[ + "alice", + { + "#bigint": "0" + } +] +``` + ### Test outputs ITF TODO: output states after fix: https://github.com/informalsystems/quint/issues/288 @@ -941,7 +1118,7 @@ exit $exit_code 5: assert(n > 0) ^ -error: Tests failed +error: Tests could not be run due to an error during compilation ``` ### Fail on run with uninitialized constants @@ -966,7 +1143,7 @@ HOME/_1041compileConst.qnt:5:24 - error: [QNT502] Name N not found 5: action init = { x' = N } ^ -error: run failed +error: Runtime error ``` ### Repl keeps right track of variables from instances @@ -992,6 +1169,22 @@ exit $exit_code >>> ``` +### Invoking `q::debug` in REPL prints values to stdout + + + +``` +echo 'q::debug("value:", { foo: 42, bar: "Hello, World!" })' | quint | tail -n +3 +``` + + +``` +>>> > value: { bar: "Hello, World!", foo: 42 } +{ bar: "Hello, World!", foo: 42 } +>>> +``` + + ### Errors are reported in the right file File `ImportFileWithError.qnt` has no error, but it imports a module from file `FileWithError.qnt`, which has a type error. The error should be reported only in `FileWithError.qnt`. @@ -1036,7 +1229,7 @@ quint test --main=invalid ./testFixture/_1050diffName.qnt ``` error: [QNT405] Main module invalid not found -error: Tests failed +error: Tests could not be run due to an error during compilation ``` ### Multiple tests output different json @@ -1055,3 +1248,48 @@ rm firstTest.itf.json secondTest.itf.json [{"#meta":{"index":0},"x":{"#bigint":"0"}},{"#meta":{"index":1},"x":{"#bigint":"1"}}] [{"#meta":{"index":0},"x":{"#bigint":"0"}},{"#meta":{"index":1},"x":{"#bigint":"2"}}] ``` + +### Variants are supported in ITF + +See [#1281](https://github.com/informalsystems/quint/issues/1281) + + +``` +quint test --output {}.itf.json ./testFixture/_1054sumTypesInItf.qnt >/dev/null +cat xTest.itf.json | jq -c .states +rm xTest.itf.json +``` + + +``` +[{"#meta":{"index":0},"x":{"tag":"None","value":{"#tup":[]}}},{"#meta":{"index":1},"x":{"tag":"Some","value":{"#bigint":"1"}}},{"#meta":{"index":2},"x":{"tag":"Some","value":{"#bigint":"2"}}}] +``` + +### FAIL on parsing filenames with different casing + + + +``` +output=$(quint parse testFixture/_1060case.qnt 2>&1) +exit_code=$? +# assuming that our test setup does not introduce spaces in filenames +echo "$output" | sed -e 's#[^ ]*/\([^/]*\).qnt# HOME/\1.qnt#g' +exit $exit_code +``` + + +``` + HOME/_1060case.qnt:3:3 - error: [QNT408] Importing two files that only differ in case: HOME/_1022importee2.qnt vs. HOME/_1022IMPORTEE2.qnt. Choose one way. +3: import importee2 as I from "_1022IMPORTEE2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + HOME/_1060case.qnt:2:3 - error: [QNT405] Module 'importee2' not found +2: import importee2 as i from "_1022importee2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + HOME/_1060case.qnt:3:3 - error: [QNT405] Module 'importee2' not found +3: import importee2 as I from "_1022IMPORTEE2" + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: parsing failed +``` diff --git a/quint/package-lock.json b/quint/package-lock.json index ea6cc8d5b..ca404595b 100644 --- a/quint/package-lock.json +++ b/quint/package-lock.json @@ -1,12 +1,12 @@ { "name": "@informalsystems/quint", - "version": "0.16.0", - "lockfileVersion": 2, + "version": "0.19.4", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.19.4", "license": "Apache 2.0", "dependencies": { "@grpc/grpc-js": "^1.8.14", @@ -15,6 +15,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -23,8 +24,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -63,77 +64,145 @@ "typescript": "^4.8.2" }, "engines": { - "node": ">=18" + "node": "18 - 20" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -143,23 +212,30 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -167,171 +243,168 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -410,9 +483,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -422,34 +495,34 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -466,13 +539,13 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -517,23 +590,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -549,20 +622,20 @@ } }, "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.1.tgz", + "integrity": "sha512-55ONqFytZExfOIjF1RjXPcVmT/jJqFzbbDqxK9jmRV4nxiYWtL9hENSW1Jfx0SdZfrvoqd44YJ/GJTqfRrawSQ==", "dependencies": { - "@grpc/proto-loader": "^0.7.0", + "@grpc/proto-loader": "^0.7.8", "@types/node": ">=12.12.47" }, "engines": { @@ -570,14 +643,13 @@ } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", "dependencies": { - "@types/long": "^4.0.1", "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", "yargs": "^17.7.2" }, "bin": { @@ -588,13 +660,13 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -615,9 +687,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -729,9 +801,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz", + "integrity": "sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw==", "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", @@ -743,37 +815,37 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz", + "integrity": "sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@nodelib/fs.scandir": { @@ -812,12 +884,11 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", + "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -825,19 +896,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==" }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", + "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -845,11 +915,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", + "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -858,11 +928,11 @@ } }, "node_modules/@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^20.0.0" } }, "node_modules/@protobufjs/aspromise": { @@ -959,36 +1029,36 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", + "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==", "dev": true }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" } }, "node_modules/@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.4.tgz", + "integrity": "sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -998,37 +1068,39 @@ "dev": true }, "node_modules/@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/lodash.isequal": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz", - "integrity": "sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.8.tgz", + "integrity": "sha512-uput6pg4E/tj2LGxCZo9+y27JNyB2OZuuI/T5F+ylVDYuqICLG2/ktjxx0v6GvVntAf8TvEzeQLcV0ffRirXuA==", "dev": true, "dependencies": { "@types/lodash": "*" } }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", "dev": true, "dependencies": { - "@types/unist": "*" + "@types/unist": "^2" } }, "node_modules/@types/mocha": { @@ -1038,90 +1110,85 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "node_modules/@types/node": { - "version": "18.16.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", - "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" + "version": "18.19.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.21.tgz", + "integrity": "sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dev": true, "dependencies": { "@types/node": "*", - "form-data": "^3.0.0" + "form-data": "^4.0.0" } }, "node_modules/@types/seedrandom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.4.tgz", - "integrity": "sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-ThA1WD8aDdVU4VLuyq5NEqriwXErF5gEIJeyT6gHBWU7JtSmW2a5qjNv3/vR82O20mW+1vhmeZJfBQPT3HCugg==", "dev": true, "dependencies": { "@types/node": "*", "minipass": "^4.0.0" } }, - "node_modules/@types/tar/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", - "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/type-utils": "5.47.0", - "@typescript-eslint/utils": "5.47.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -1143,14 +1210,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", - "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -1170,13 +1237,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", - "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1187,13 +1254,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", - "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.47.0", - "@typescript-eslint/utils": "5.47.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1214,9 +1281,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", - "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1227,13 +1294,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", - "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1254,18 +1321,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", - "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -1280,12 +1347,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", - "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1296,10 +1363,16 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1318,9 +1391,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1470,16 +1543,32 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -1498,15 +1587,53 @@ "node": ">=8" } }, + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1517,14 +1644,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -1535,16 +1662,38 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/assertion-error": { @@ -1566,17 +1715,41 @@ } }, "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", @@ -1624,9 +1797,9 @@ "dev": true }, "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { "node": "*" } @@ -1669,9 +1842,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -1681,13 +1854,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -1712,13 +1889,19 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1743,9 +1926,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", + "version": "1.0.30001591", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz", + "integrity": "sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==", "dev": true, "funding": [ { @@ -1755,22 +1938,26 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -1808,10 +1995,13 @@ "dev": true }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -1991,18 +2181,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/copyfiles/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/copyfiles/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2119,12 +2297,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/define-properties": { + "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -2197,10 +2393,25 @@ "node": ">=6.0.0" } }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.689", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.689.tgz", + "integrity": "sha512-GatzRKnGPS1go29ep25reM94xxd1Wj8ritU0yRhCJ/tr1Bg8gKnm6R9O/yPOhGQBoLMZ9ezfrpghNaTw97C/PQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2214,36 +2425,52 @@ "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" }, "node_modules/es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -2252,13 +2479,80 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-shim-unscopables": { + "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz", + "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.4", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -2285,9 +2579,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -2305,27 +2599,28 @@ } }, "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2333,22 +2628,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2464,9 +2756,9 @@ } }, "node_modules/eslint-config-esnext/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -2673,6 +2965,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-esnext/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-esnext/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -2730,9 +3034,9 @@ } }, "node_modules/eslint-config-esnext/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2917,9 +3221,9 @@ } }, "node_modules/eslint-config-node/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3126,6 +3430,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-node/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-node/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3183,9 +3499,9 @@ } }, "node_modules/eslint-config-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3270,9 +3586,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -3384,9 +3700,9 @@ } }, "node_modules/eslint-config-react-native/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3606,6 +3922,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-react-native/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-react-native/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -3663,9 +3991,9 @@ } }, "node_modules/eslint-config-react-native/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -3852,9 +4180,9 @@ } }, "node_modules/eslint-config-recommended/node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4061,6 +4389,18 @@ "node": ">= 0.8.0" } }, + "node_modules/eslint-config-recommended/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/eslint-config-recommended/node_modules/optionator": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", @@ -4118,9 +4458,9 @@ } }, "node_modules/eslint-config-recommended/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4205,13 +4545,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4224,9 +4565,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4283,49 +4624,29 @@ "eslint": ">=4.19.1" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -4335,12 +4656,12 @@ } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -4355,11 +4676,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-json": { "version": "3.1.0", @@ -4394,34 +4718,10 @@ "eslint": ">=5.16.0" } }, - "node_modules/eslint-plugin-node/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-node/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4440,15 +4740,16 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.31.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", - "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -4457,8 +4758,8 @@ "object.hasown": "^1.1.2", "object.values": "^1.1.6", "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { @@ -4487,12 +4788,12 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4504,9 +4805,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4565,36 +4866,33 @@ } }, "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4604,9 +4902,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4620,14 +4918,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4718,9 +5016,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4758,9 +5056,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -4802,6 +5100,36 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4866,12 +5194,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -4879,11 +5208,20 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -4898,9 +5236,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -4965,9 +5303,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -4979,21 +5317,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5027,12 +5368,13 @@ } }, "node_modules/genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.2.0.tgz", + "integrity": "sha512-OIYSX6XYA8PHecLDCTri30hadSZfAjZ8Iq1+BBDXqLWP4dRLuJNLoNjsSWtTpw97IccK2LDWzkEstxAB8GdN7g==", "dev": true, "dependencies": { "commander": "^7.2.0", + "ejs": "^3.1.9", "find-package": "^1.0.0" }, "bin": { @@ -5051,23 +5393,28 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5083,13 +5430,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5099,15 +5447,15 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -5131,9 +5479,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5145,6 +5493,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5178,29 +5541,17 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -5219,21 +5570,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { + "node_modules/has-proto": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -5242,14 +5593,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -5282,6 +5645,18 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5310,18 +5685,18 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5398,19 +5773,50 @@ } }, "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -5487,12 +5893,12 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5522,6 +5928,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -5530,6 +5948,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5542,10 +5975,19 @@ "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { + "node_modules/is-map": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5599,14 +6041,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5623,13 +6057,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5677,6 +6123,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5695,6 +6156,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5707,6 +6177,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -5739,9 +6222,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -5775,9 +6258,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -5801,17 +6284,32 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { @@ -5829,9 +6327,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -5841,14 +6339,35 @@ "node": ">=8" } }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/js-tokens": { @@ -5889,6 +6408,12 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -5902,9 +6427,9 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -5914,24 +6439,35 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true }, "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -5988,6 +6524,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -6022,9 +6563,9 @@ } }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -6039,12 +6580,12 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lru-cache": { @@ -6072,9 +6613,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6087,9 +6628,9 @@ "dev": true }, "node_modules/mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -6111,10 +6652,13 @@ } }, "node_modules/mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" @@ -6130,9 +6674,9 @@ } }, "node_modules/micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "dev": true, "funding": [ { @@ -6165,9 +6709,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "dev": true, "funding": [ { @@ -6199,9 +6743,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "dev": true, "funding": [ { @@ -6220,9 +6764,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "dev": true, "funding": [ { @@ -6242,9 +6786,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "dev": true, "funding": [ { @@ -6262,9 +6806,9 @@ } }, "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "dev": true, "funding": [ { @@ -6280,14 +6824,13 @@ "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "dev": true, "funding": [ { @@ -6307,9 +6850,9 @@ } }, "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "dev": true, "funding": [ { @@ -6327,9 +6870,9 @@ } }, "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "dev": true, "funding": [ { @@ -6346,9 +6889,9 @@ } }, "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", "dev": true, "funding": [ { @@ -6367,9 +6910,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", "dev": true, "funding": [ { @@ -6387,9 +6930,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", "dev": true, "funding": [ { @@ -6406,9 +6949,9 @@ } }, "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", "dev": true, "funding": [ { @@ -6428,9 +6971,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", "dev": true, "funding": [ { @@ -6444,9 +6987,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", "dev": true, "funding": [ { @@ -6460,9 +7003,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "dev": true, "funding": [ { @@ -6479,9 +7022,9 @@ } }, "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", "dev": true, "funding": [ { @@ -6498,9 +7041,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", "dev": true, "funding": [ { @@ -6519,9 +7062,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", "dev": true, "funding": [ { @@ -6541,9 +7084,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "dev": true, "funding": [ { @@ -6557,9 +7100,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "dev": true, "funding": [ { @@ -6628,18 +7171,19 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6673,21 +7217,20 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "bin": { "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "dependencies": { "ansi-colors": "4.1.1", @@ -6697,13 +7240,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -6718,10 +7260,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/mocha/node_modules/brace-expansion": { @@ -6744,13 +7282,32 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" @@ -6816,18 +7373,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6846,25 +7391,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -6878,9 +7404,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/noms": { @@ -7080,9 +7606,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7098,13 +7624,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -7116,28 +7642,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7146,28 +7672,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "dev": true, + "dependencies": { + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" + } + }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7200,17 +7739,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -7454,6 +7993,15 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7517,9 +8065,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", + "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -7539,20 +8087,10 @@ "node": ">=12.0.0" } }, - "node_modules/protobufjs/node_modules/@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" @@ -7623,15 +8161,37 @@ "node": ">=8.10.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", + "integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0", + "get-intrinsic": "^1.2.3", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7665,9 +8225,9 @@ } }, "node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", + "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", "dev": true, "dependencies": { "@types/mdast": "^3.0.0", @@ -7694,12 +8254,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -7813,6 +8373,30 @@ "node": ">=6" } }, + "node_modules/safe-array-concat": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7834,15 +8418,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7859,9 +8446,9 @@ "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7906,6 +8493,38 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7928,14 +8547,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8058,47 +8681,65 @@ } }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8225,9 +8866,9 @@ } }, "node_modules/tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -8240,15 +8881,12 @@ "node": ">=10" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/tar/node_modules/yallist": { @@ -8293,9 +8931,9 @@ } }, "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", @@ -8355,15 +8993,10 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "funding": { "type": "github", @@ -8371,9 +9004,9 @@ } }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -8423,13 +9056,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -8477,9 +9110,9 @@ } }, "node_modules/txm": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/txm/-/txm-8.1.0.tgz", - "integrity": "sha512-mVDmoN13jYX3igNcnS+TEJJmMIRLjn0wch/wOI23z5IkCKiw9xinv1WkugB55j57W8MfuEk/psVVO4BWMfZxfA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/txm/-/txm-8.2.0.tgz", + "integrity": "sha512-ALNu1KIbUMXlsl/UacjfhbtG4CWK07JYtf0KNf8aXhoixmtgMj2MdOit5er6V8qh5eTIvtB6+AexIQMLZhSz6Q==", "dev": true, "dependencies": { "async": "^3.2.1", @@ -8497,9 +9130,9 @@ } }, "node_modules/txm/node_modules/supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "engines": { "node": ">=12" @@ -8541,6 +9174,79 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -8551,9 +9257,9 @@ } }, "node_modules/typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8578,6 +9284,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/unified": { "version": "10.1.2", "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", @@ -8598,9 +9309,9 @@ } }, "node_modules/unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dev": true, "dependencies": { "@types/unist": "^2.0.0" @@ -8611,9 +9322,9 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/untildify": { "version": "4.0.0", @@ -8625,9 +9336,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -8637,6 +9348,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -8644,7 +9359,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -8693,9 +9408,9 @@ } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/v8-compile-cache-lib": { @@ -8705,9 +9420,9 @@ "dev": true }, "node_modules/vfile": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", @@ -8721,9 +9436,9 @@ } }, "node_modules/vfile-message": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dev": true, "dependencies": { "@types/unist": "^2.0.0", @@ -8748,15 +9463,15 @@ } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==", "dev": true }, "node_modules/vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", "dev": true }, "node_modules/vscode-nls": { @@ -8766,25 +9481,11 @@ "dev": true }, "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", "dev": true }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8816,44 +9517,110 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrappy": { + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" @@ -8882,6 +9649,18 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -9008,6621 +9787,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", - "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", - "dev": true - }, - "@babel/core": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.7.tgz", - "integrity": "sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.7", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", - "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz", - "integrity": "sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.7.tgz", - "integrity": "sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", - "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", - "dev": true - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.8.tgz", - "integrity": "sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", - "dev": true - }, - "@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "requires": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^17.7.2" - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", - "requires": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" - }, - "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", - "requires": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", - "requires": { - "@octokit/types": "^11.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", - "requires": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sweet-monads/either": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/either/-/either-3.2.0.tgz", - "integrity": "sha512-n+nR0b60GRTKb+D76qhTf4NEBXU9zfpigYYEtKtSYbV+5+i5gxr9jFd64pYkY2O7hVsb/G7nspbAeFni/i1ltA==", - "requires": { - "@sweet-monads/interfaces": "^3.2.0" - } - }, - "@sweet-monads/interfaces": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/interfaces/-/interfaces-3.3.0.tgz", - "integrity": "sha512-66akGvjPD4lizQy+w4JSltJilc2w/QPdw8lPAniLJGHwyjmrw9xMJLx76Q/GDnbCU59Werses4aZJLWOlJrL5A==" - }, - "@sweet-monads/maybe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@sweet-monads/maybe/-/maybe-3.2.0.tgz", - "integrity": "sha512-/t+K0D/kBfkYOkZaePEsrK868at0M9UIEVgehcM0xscrCSZhKWGteE41vl2XJQqh8WyiFo/mZ5y7eAPSYzS+pg==", - "requires": { - "@sweet-monads/interfaces": "^3.2.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "dev": true, - "requires": { - "@types/ms": "*" - } - }, - "@types/json-bigint": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/json-bigint/-/json-bigint-1.0.1.tgz", - "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" - }, - "@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true - }, - "@types/lodash.isequal": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@types/lodash.isequal/-/lodash.isequal-4.5.6.tgz", - "integrity": "sha512-Ww4UGSe3DmtvLLJm2F16hDwEQSv7U0Rr8SujLUA2wHI2D2dm8kPu6Et+/y303LfjTIwSBKXB/YTUcAKpem/XEg==", - "dev": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dev": true, - "requires": { - "@types/unist": "*" - } - }, - "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "@types/node": { - "version": "18.16.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.0.tgz", - "integrity": "sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==" - }, - "@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/seedrandom": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.4.tgz", - "integrity": "sha512-/rWdxeiuZenlawrHU+XV6ZHMTKOqrC2hMfeDfLTIWJhDZP5aVqXRysduYHBbhD7CeJO6FJr/D2uBVXB7GT6v7w==" - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", - "dev": true, - "requires": { - "@types/node": "*", - "minipass": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true - } - } - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", - "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", - "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/type-utils": "5.47.0", - "@typescript-eslint/utils": "5.47.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", - "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", - "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", - "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.47.0", - "@typescript-eslint/utils": "5.47.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", - "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", - "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/visitor-keys": "5.47.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", - "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.47.0", - "@typescript-eslint/types": "5.47.0", - "@typescript-eslint/typescript-estree": "5.47.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", - "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.47.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" - }, - "antlr4ts-cli": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts-cli/-/antlr4ts-cli-0.5.0-alpha.4.tgz", - "integrity": "sha512-lVPVBTA2CVHRYILSKilL6Jd4hAumhSZZWA7UbQNQrmaSSj7dPmmYaN4bOmZG79cOy0lS00i4LY68JZZjZMWVrw==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "babel-eslint": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", - "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.7.0", - "@babel/traverse": "^7.7.0", - "@babel/types": "^7.7.0", - "eslint-visitor-keys": "^1.0.0", - "resolve": "^1.12.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001441", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz", - "integrity": "sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "copyfiles": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", - "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "minimatch": "^3.0.3", - "mkdirp": "^1.0.4", - "noms": "0.0.0", - "through2": "^2.0.1", - "untildify": "^4.0.0", - "yargs": "^16.1.0" - }, - "dependencies": { - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dev": true, - "requires": { - "character-entities": "^2.0.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diff-match-patch": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz", - "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "eol": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz", - "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==" - }, - "es-abstract": { - "version": "1.20.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", - "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "unbox-primitive": "^1.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - } - } - }, - "eslint-config-esnext": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-esnext/-/eslint-config-esnext-4.1.0.tgz", - "integrity": "sha512-GhfVEXdqYKEIIj7j+Fw2SQdL9qyZMekgXfq6PyXM66cQw0B435ddjz3P3kxOBVihMRJ0xGYjosaveQz5Y6z0uA==", - "dev": true, - "requires": { - "babel-eslint": "^10.0.1", - "eslint": "^6.8.0", - "eslint-plugin-babel": "^5.2.1", - "eslint-plugin-import": "^2.14.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-node/-/eslint-config-node-4.1.0.tgz", - "integrity": "sha512-Wz17xV5O2WFG8fGdMYEBdbiL6TL7YNJSJvSX9V4sXQownewfYmoqlly7wxqLkOUv/57pq6LnnotMiQQrrPjCqQ==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-config-react-native": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-react-native/-/eslint-config-react-native-4.1.0.tgz", - "integrity": "sha512-kNND+cs+ztawH7wgajf/K6FfNshjlDsFDAkkFZF9HAXDgH1w1sNMIfTfwzufg0hOcSK7rbiL4qbG/gg/oR507Q==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0", - "eslint-plugin-react": "^7.19.0", - "eslint-plugin-react-native": "^3.8.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-plugin-react-native": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-3.11.0.tgz", - "integrity": "sha512-7F3OTwrtQPfPFd+VygqKA2VZ0f2fz0M4gJmry/TRE18JBb94/OtMxwbL7Oqwu7FGyrdeIOWnXQbBAveMcSTZIA==", - "dev": true, - "requires": { - "@babel/traverse": "^7.7.4", - "eslint-plugin-react-native-globals": "^0.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-config-recommended": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-recommended/-/eslint-config-recommended-4.1.0.tgz", - "integrity": "sha512-2evA0SX1VqtyFiExmBI2WAO4XQCKlr7wmNELE8rcT5PyZY2ixsY881ofVZWKuI/dywpgLiES1gR/XUQcnVLRzQ==", - "dev": true, - "requires": { - "eslint": "^6.8.0", - "eslint-config-esnext": "^4.1.0", - "eslint-config-node": "^4.1.0", - "eslint-config-react-native": "^4.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", - "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-json": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-3.1.0.tgz", - "integrity": "sha512-MrlG2ynFEHe7wDGwbUuFPsaT2b1uhuEFhJ+W1f1u+1C2EkXmTYJp4B1aAdQQ8M+CC3t//N/oRKiIVw14L2HR1g==", - "dev": true, - "requires": { - "lodash": "^4.17.21", - "vscode-json-languageservice": "^4.1.6" - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "dev": true, - "requires": {} - }, - "eslint-plugin-react": { - "version": "7.31.11", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", - "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react-native-globals": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", - "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", - "dev": true - }, - "eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", - "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-package": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz", - "integrity": "sha512-yVn71XCCaNgxz58ERTl8nA/8YYtIQDY9mHSrgFBfiFtdNNfY0h183Vh8BRkKxD8x9TUw3ec290uJKhDVxqGZBw==", - "dev": true, - "requires": { - "parents": "^1.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "genversion": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.1.1.tgz", - "integrity": "sha512-/H861PMsihhjgX2qqhTN8egM11V04imhA+3JRFY3jjPua2Sy1NqaqqQPjSP8rdM9jZoKpFhVj9g3Fs9XPCjBYQ==", - "dev": true, - "requires": { - "commander": "^7.2.0", - "find-package": "^1.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-sdsl": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", - "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "line-column": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", - "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", - "requires": { - "isarray": "^1.0.0", - "isobject": "^2.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - } - }, - "mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", - "dev": true, - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "dev": true, - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "dev": true, - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", - "dev": true - }, - "micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", - "dev": true - }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "dev": true, - "requires": { - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "dev": true, - "requires": { - "micromark-util-types": "^1.0.0" - } - }, - "micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", - "dev": true, - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "dev": true, - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", - "dev": true - }, - "micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "noms": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", - "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "fromentries": "^1.2.0" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "dependencies": { - "@types/node": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.0.tgz", - "integrity": "sha512-O+z53uwx64xY7D6roOi4+jApDGFg0qn6WHcxe5QeqjMaTezBO/mxdfFXIVAVVyNWKx84OmPB3L8kbVYOTeN34A==" - }, - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dev": true, - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "requires": { - "mri": "^1.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "tar": { - "version": "6.1.14", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz", - "integrity": "sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "txm": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/txm/-/txm-8.1.0.tgz", - "integrity": "sha512-mVDmoN13jYX3igNcnS+TEJJmMIRLjn0wch/wOI23z5IkCKiw9xinv1WkugB55j57W8MfuEk/psVVO4BWMfZxfA==", - "dev": true, - "requires": { - "async": "^3.2.1", - "diff-match-patch": "^1.0.5", - "kleur": "^4.1.4", - "remark-parse": "^10.0.1", - "supports-color": "^9.1.0", - "unified": "^10.1.1" - }, - "dependencies": { - "supports-color": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.3.1.tgz", - "integrity": "sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.9.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", - "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - } - }, - "unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - } - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "vfile": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.6.tgz", - "integrity": "sha512-ADBsmerdGBs2WYckrLBEmuETSPyTD4TuLxTrw0DvjirxW1ra4ZwkbzG8ndsv3Q57smvHxo677MHaQrY9yxH8cA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - } - }, - "vfile-message": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.3.tgz", - "integrity": "sha512-0yaU+rj2gKAyEk12ffdSbBfjnnj+b1zqTBv3OQCTn8yEB02bsPizwdBPrLJjHnK+cU9EMMcUnNv938XcZIkmdA==", - "dev": true, - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } - }, - "vscode-json-languageservice": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.2.1.tgz", - "integrity": "sha512-xGmv9QIWs2H8obGbWg+sIPI/3/pFgj/5OWBhNzs00BkYQ9UaB2F6JJaGB/2/YOZJ3BvLXQTC4Q7muqU25QgAhA==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-languageserver-textdocument": "^1.0.3", - "vscode-languageserver-types": "^3.16.0", - "vscode-nls": "^5.0.0", - "vscode-uri": "^3.0.3" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "vscode-nls": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", - "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } diff --git a/quint/package.json b/quint/package.json index aa62d0ed6..3ae4006bc 100644 --- a/quint/package.json +++ b/quint/package.json @@ -1,6 +1,6 @@ { "name": "@informalsystems/quint", - "version": "0.16.0", + "version": "0.19.4", "description": "Core tool for the Quint specification language", "keywords": [ "temporal", @@ -41,7 +41,7 @@ "test/**/*.ts" ], "engines": { - "node": ">=18" + "node": "18 - 20" }, "repository": { "type": "git", @@ -63,7 +63,8 @@ "line-column": "^1.0.2", "lodash": "^4.17.21", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", + "lodash.clonedeep": "4.5.0", + "@types/lodash.clonedeep": "4.5.0", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -72,6 +73,8 @@ "compile": "genversion -e src/version.ts && tsc && copyfiles -u 1 ./src/reflection.proto ./src/builtin.qnt ./dist/src/", "prepare": "rm -rf ./dist && npm run compile && chmod +x ./dist/src/cli.js", "test": "mocha --reporter-option maxDiffSize=0 -r ts-node/register test/*.test.ts test/**/*.test.ts", + "test-w": "while inotifywait -r -e close_write ./ ; do npm run test; done", + "test-f": "mocha --reporter-option maxDiffSize=0 -r ts-node/register", "coverage": "nyc npm run test", "integration": "txm cli-tests.md && txm io-cli-tests.md", "apalache-integration": "txm apalache-tests.md", diff --git a/quint/src/FreshVarGenerator.ts b/quint/src/FreshVarGenerator.ts index 55db3d18b..672ebcabd 100644 --- a/quint/src/FreshVarGenerator.ts +++ b/quint/src/FreshVarGenerator.ts @@ -16,7 +16,7 @@ export class FreshVarGenerator { private freshVarCounters: Map = new Map() freshVar(prefix: string): string { - const counter = this.freshVarCounters.get(prefix)! ?? 0 + const counter = this.freshVarCounters.get(prefix) ?? 0 this.freshVarCounters.set(prefix, counter + 1) return `${prefix}${counter}` diff --git a/quint/src/apalache.ts b/quint/src/apalache.ts new file mode 100644 index 000000000..ae00a7015 --- /dev/null +++ b/quint/src/apalache.ts @@ -0,0 +1,441 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2023 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Interface to Apalache + * + * This functionality is enabled by managing and interacting with the Apalache + * server. + * + * @author Shon Feder + * + * @module + */ + +import { Either, chain, left, right } from '@sweet-monads/either' +import { ErrorMessage } from './ErrorMessage' +import path from 'path' +import fs from 'fs' +import os from 'os' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// import semver from 'semver' +import { pipeline } from 'stream/promises' +import child_process from 'child_process' +import * as tar from 'tar' +import * as grpc from '@grpc/grpc-js' +import * as proto from '@grpc/proto-loader' +import * as protobufDescriptor from 'protobufjs/ext/descriptor' +import { setTimeout } from 'timers/promises' +import { promisify } from 'util' +import { ItfTrace } from './itf' +import { verbosity } from './verbosity' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// import { request as octokitRequest } from '@octokit/request' + +import type { Buffer } from 'buffer' +import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' + +const APALACHE_SERVER_URI = 'localhost:8822' +const APALACHE_VERSION_TAG = '0.44.11' +// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 +// const APALACHE_TGZ = 'apalache.tgz' + +function quintConfigDir(): string { + return path.join(os.homedir(), '.quint') +} + +function apalacheDistDir(): string { + return path.join(quintConfigDir(), `apalache-dist-${APALACHE_VERSION_TAG}`) +} + +// The structure used to report errors +type ApalacheError = { + explanation: string + errors: ErrorMessage[] + traces?: ItfTrace[] +} + +export type ApalacheResult = Either + +// An object representing the Apalache configuration +// See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 +type ApalacheConfig = any + +// Interface to the apalache server +// This is likely to be expanded in the future +type Apalache = { + // Run the check command with the given configuration + check: (c: ApalacheConfig) => Promise> + // Convert the provided input into formatted TLA + tla: (c: ApalacheConfig) => Promise> +} + +function handleVerificationFailure(failure: { pass_name: string; error_data: any }): ApalacheError { + switch (failure.pass_name) { + case 'SanyParser': + return { + explanation: `internal error: while parsing in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, + errors: [], + } + case 'TypeCheckerSnowcat': + return { + explanation: `internal error: while type checking in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, + errors: [], + } + case 'BoundedChecker': + switch (failure.error_data.checking_result) { + case 'Error': + return { explanation: 'found a counterexample', traces: failure.error_data.counterexamples, errors: [] } + case 'Deadlock': + return { explanation: 'reached a deadlock', traces: failure.error_data.counterexamples, errors: [] } + default: + throw new Error(`internal error: unhandled verification error ${failure.error_data.checking_result}`) + } + default: + throw new Error(`internal error: unhandled verification error at pass ${failure.pass_name}`) + } +} + +async function handleResponse(response: RunResponse): Promise> { + if (response.result == 'success') { + const success = JSON.parse(response.success) + return right(success) + } else { + switch (response.failure.errorType) { + case 'UNEXPECTED': { + const errData = JSON.parse(response.failure.data) + return err(errData.msg) + } + case 'PASS_FAILURE': + return left(handleVerificationFailure(JSON.parse(response.failure.data))) + default: + // TODO handle other error cases + return err(`${response.failure.errorType}: ${response.failure.data}`) + } + } +} + +// Construct the Apalache interface around the cmdExecutor +function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { + const check = async (c: ApalacheConfig): Promise> => { + return cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }).then(handleResponse) + } + + const tla = async (c: ApalacheConfig): Promise> => { + return cmdExecutor.run({ cmd: 'TLA', config: JSON.stringify(c) }).then(handleResponse) + } + + return { check, tla } +} + +// Alias for an async callback for values of type T used to annotate +// callback-based methods so we can convert them into promise-based methods via +// promiseify. +type AsyncCallBack = (err: any, result: T) => void + +// The core grpc tooling doesn't support generation of typing info, +// we therefore record the structure we require from the grpc generation +// in the following types. +// +// The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto + +type RunRequest = { cmd: string; config: string } + +type RunResponse = + | { result: 'failure'; failure: { errorType: string; data: string } } + // The success data also includes the parsed module, either as JSON + // representing the Apalache IR, or as a TLA string (if the `TLA` command is used) + | { result: 'success'; success: string } + +// The interface for the CmdExecutor service generated by the gRPC library +type CmdExecutor = { + // Constructs a new client service + new (url: string, creds: any): CmdExecutor + run: (req: RunRequest, cb: AsyncCallBack) => void +} + +// The refined interface to the CmdExecutor we produce from the generated interface +type AsyncCmdExecutor = { + run: (req: RunRequest) => Promise +} + +// The interface for the Shai package +type ShaiPkg = { + cmdExecutor: { + CmdExecutor: CmdExecutor + } +} + +// Helper to construct errors results +function err(explanation: string, errors: ErrorMessage[] = [], traces?: ItfTrace[]): ApalacheResult { + return left({ explanation, errors, traces }) +} + +// See https://grpc.io/docs/languages/node/basics/#example-code-and-setup +const grpcStubOptions = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +} + +async function loadProtoDefViaReflection(retry: boolean): Promise> { + // Types of the gRPC interface + type ServerReflectionRequest = { file_containing_symbol: string } + type ServerReflectionResponseSuccess = { + file_descriptor_response: { + file_descriptor_proto: Buffer[] + } + } + type ServerReflectionResponseFailure = { + error_response: { + error_code: number + error_message: string + } + } + type ServerReflectionResponse = ServerReflectionResponseSuccess | ServerReflectionResponseFailure + type ServerReflectionService = { + new (url: string, creds: grpc.ChannelCredentials): ServerReflectionService + ServerReflectionInfo: () => grpc.ClientDuplexStream + getChannel: () => { getConnectivityState: (_: boolean) => grpc.connectivityState } + } + type ServerReflectionPkg = { + grpc: { reflection: { v1alpha: { ServerReflection: ServerReflectionService } } } + } + + // Obtain a reflection service client + const protoPath = require.resolve('./reflection.proto') + const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) + const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg + const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection + const reflectionClient = new serverReflectionService(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) + + // Wait for gRPC channel to come up, with 1sec pauses + if (retry) { + for (;;) { + const grpcChannelState = reflectionClient.getChannel().getConnectivityState(true) + if (grpcChannelState == grpc.connectivityState.READY) { + break + } else { + /* I suspect that there is a race with async gRPC code that actually + * brings the connection up, so we need to yield control here. In + * particular, waiting for the channel to come up in a busy-waiting loop + * does NOT work. + */ + await setTimeout(1000) + } + } + } + + // Query reflection endpoint + return new Promise>((resolve, _) => { + const call = reflectionClient.ServerReflectionInfo() + call.on('data', (r: ServerReflectionResponse) => { + call.end() + resolve(right(r)) + }) + call.on('error', (e: grpc.StatusObject) => resolve(err(`Error querying reflection endpoint: ${e}`))) + + call.write({ file_containing_symbol: 'shai.cmdExecutor.CmdExecutor' }) + }).then(protoDefResponse => + protoDefResponse.chain(protoDefResponse => { + // Construct a proto definition of the reflection response. + if ('error_response' in protoDefResponse) { + return err( + `Apalache gRPC endpoint is corrupted. Could not extract proto file: ${protoDefResponse.error_response.error_message}` + ) + } + + // Decode reflection response to FileDescriptorProto + let fileDescriptorProtos = protoDefResponse.file_descriptor_response.file_descriptor_proto.map( + bytes => protobufDescriptor.FileDescriptorProto.decode(bytes) as protobufDescriptor.IFileDescriptorProto + ) + + // Use proto-loader to load the FileDescriptorProto wrapped in a FileDescriptorSet + return right(proto.loadFileDescriptorSetFromObject({ file: fileDescriptorProtos }, grpcStubOptions)) + }) + ) +} + +function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { + const protoDescriptor = grpc.loadPackageDefinition(protoDef) + // The cast thru `unkown` lets us convince the type system of anything + // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion + const pkg = protoDescriptor.shai as unknown as ShaiPkg + const stub: any = new pkg.cmdExecutor.CmdExecutor(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) + return { + run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), + } +} + +/** + * Connect to the Apalache server, and verify that the gRPC channel is up. + * + * @param retry Wait for the gRPC connection to come up. + * + * @returns A promise resolving to a `right` if the connection is + * successful, or a `left` if not. + */ +async function tryConnect(retry: boolean = false): Promise> { + return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) +} + +function downloadAndUnpackApalache(): Promise> { + const url = `https://github.com/informalsystems/apalache/releases/download/v${APALACHE_VERSION_TAG}/apalache.tgz` + return fetch(url) + .then( + // unpack response body + res => pipeline(res.body!, tar.extract({ cwd: apalacheDistDir(), strict: true })), + error => err(`Error fetching ${url}: ${error}`) + ) + .then( + _ => right(null), + error => err(`Error unpacking .tgz: ${error}`) + ) +} + +/** + * Fetch the latest Apalache release pinned by `APALACHE_VERSION_TAG` from Github. + * + * @returns A promise resolving to: + * - a `right` equal to the path the Apalache dist was unpacked to, + * - a `left` indicating an error. + */ +async function fetchApalache(verbosityLevel: number): Promise> { + const apalacheBinary = path.join(apalacheDistDir(), 'apalache', 'bin', 'apalache-mc') + if (fs.existsSync(apalacheBinary)) { + // Use existing download + debugLog(verbosityLevel, `Using existing Apalache distribution in ${apalacheBinary}`) + return right(apalacheBinary) + } else { + fs.mkdirSync(apalacheDistDir(), { recursive: true }) + process.stdout.write('Downloading Apalache distribution...') + const res = await downloadAndUnpackApalache() + process.stdout.write(' done.\n') + return res.map(_ => apalacheBinary) + } + + // TODO: This logic makes the CLI tool extremely sensitive to environment. + // See https://github.com/informalsystems/quint/issues/1124 + // Fetch Github releases + // return octokitRequest('GET /repos/informalsystems/apalache/releases').then( + // async resp => { + // // Find latest that satisfies `APALACHE_VERSION_TAG` + // const versions = resp.data.map((element: any) => element.tag_name) + // const latestTaggedVersion = semver.parse(semver.maxSatisfying(versions, APALACHE_VERSION_TAG)) + // if (latestTaggedVersion === null) { + // return err(`Failed to deteremine a valid semver version vesion from ${versions} and ${APALACHE_VERSION_TAG}`) + // } + // // Check if we have already downloaded this release + // const unpackPath = apalacheDistDir() + // const apalacheBinary = path.join(unpackPath, 'apalache', 'bin', 'apalache-mc') + // if (fs.existsSync(apalacheBinary)) { + // // Use existing download + // console.log(`Using existing Apalache distribution in ${unpackPath}`) + // return right(unpackPath) + // } else { + // // No existing download, download Apalache dist + // fs.mkdirSync(unpackPath, { recursive: true }) + + // // Filter release response to get dist archive asset URL + // const taggedRelease = resp.data.find((element: any) => element.tag_name == latestTaggedVersion) + // const tgzAsset = taggedRelease.assets.find((asset: any) => asset.name == APALACHE_TGZ) + // const downloadUrl = tgzAsset.browser_download_url + + // console.log(`Downloading Apalache distribution from ${downloadUrl}...`) + // return fetch(downloadUrl) + // .then( + // // unpack response body + // res => pipeline(res.body, tar.extract({ cwd: unpackPath, strict: true })), + // error => err(`Error fetching ${downloadUrl}: ${error}`) + // ) + // .then( + // _ => right(unpackPath), + // error => err(`Error unpacking .tgz: ${error}`) + // ) + // } + // }, + // error => err(`Error listing the Apalache releases: ${error}`) + // ) +} + +/** + * Connect to an already running Apalache server, or – if unsuccessful – fetch + * Apalache, spawn it, and connect to it. + * + * If an Apalache server is spawned, the child process exits when the parent process (i.e., this process) terminates. + * + * @returns A promise resolving to: + * - a `right` equal to the path the Apalache dist was unpacked to, + * - a `left` indicating an error. + */ +export async function connect(verbosityLevel: number): Promise> { + // Try to connect to Shai, and try to ping it + const connectionResult = await tryConnect() + // We managed to connect, simply return this connection + if (connectionResult.isRight()) { + return connectionResult + } + + // Connection or pinging failed, download Apalache + debugLog(verbosityLevel, 'No running Apalache server found, launching...') + const exeResult = await fetchApalache(verbosityLevel) + // Launch Apalache from download + return exeResult + .asyncChain( + async exe => + new Promise>((resolve, _) => { + debugLog(verbosityLevel, 'Launching Apalache server') + const apalache = child_process.spawn(exe, ['server']) + + // Exit handler that kills Apalache if Quint exists + function exitHandler() { + debugLog(verbosityLevel, 'Shutting down Apalache server') + try { + process.kill(apalache.pid!) + } catch (error: any) { + // ESRCH is raised if no process with `pid` exists, i.e., + // if Apalache server exited on its own + if (error.code == 'ESRCH') { + debugLog(verbosityLevel, 'Apalache already exited') + } else { + throw error + } + } + } + + if (apalache.pid) { + // Apalache launched successfully + + // Install exit handler that kills Apalache if Quint exists + process.on('exit', exitHandler.bind(null)) + process.on('SIGINT', exitHandler.bind(null)) + process.on('SIGUSR1', exitHandler.bind(null)) + process.on('SIGUSR2', exitHandler.bind(null)) + process.on('uncaughtException', exitHandler.bind(null)) + + resolve(right(void 0)) + } + // If Apalache fails to spawn, `apalache.pid` is undefined and 'error' is + // emitted. + apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) + }) + ) + .then(chain(() => tryConnect(true))) +} + +/** + * Log `msg` to the console if `verbosityLevel` implies debug output. + * + * @param verbosityLevel the current verbosity level (set with --verbosity) + * @param msg the message to log + */ +function debugLog(verbosityLevel: number, msg: string) { + if (verbosity.hasDebugInfo(verbosityLevel)) { + console.log(msg) + } +} diff --git a/quint/src/builtin.qnt b/quint/src/builtin.qnt index f11a0bfc4..6fd5aca6a 100644 --- a/quint/src/builtin.qnt +++ b/quint/src/builtin.qnt @@ -215,15 +215,16 @@ module builtin { /// ``` pure def flatten(s): (Set[Set[a]]) => Set[a] - /// `s.allLists()` is the set of all lists containing all the elements in `s`. + /// `s.allLists()` is the set of all lists containing elements in `s`. + /// This is an infinite set unless `s` is the empty set. + /// + /// Like other inifite sets, this is not supported in the simulator. /// /// ### Examples /// /// ``` - /// assert(Set(1, 2).allLists() == Set( - /// List(1, 2), - /// List(2, 1), - /// )) + /// assert(Set(1, 2).allLists().contains([])) + /// assert(Set(1, 2).allLists().contains([1, 1, 1, 1, 2, 1])) /// ``` pure def allLists(s): (Set[a]) => Set[List[a]] @@ -780,7 +781,9 @@ module builtin { /// /// `a` is true for a step from `s1` to `t` and `b` is true for a step from `t` to `s2`. /// - /// This is the action composition operator. + /// This is the action composition operator. If `a` evaluates to `false`, then + /// `a.then(b)` reports an error. If `b` evaluates to `false` after `a`, then + /// `a.then(b)` returns `false`. /// /// ### Examples /// @@ -790,6 +793,25 @@ module builtin { /// ``` action then(a, b): (bool, bool) => bool + /// `a.expect(b)` is true for a step from `s1` to `s2` if + /// + /// - `a` is true for a step from `s1` to `s2`, and + /// - `b` holds true in `s2`. + /// + /// If `a` evaluates to `false`, evaluation of `a.expect(b)` + /// fails with an error message. If `b` evaluates to `false`, + /// evaluation of `a.expect(b)` fails with an error message. + /// + /// ### Examples + /// + /// ``` + /// var n: int + /// run expectConditionOkTest = (n' = 0).then(n' = 3).expect(n == 3) + /// run expectConditionFailsTest = (n' = 0).then(n' = 3).expect(n == 4) + /// run expectRunFailsTest = (n' = 0).then(all { n == 2, n' = 3 }).expect(n == 4) + /// ``` + action expect(a, b): (bool, bool) => bool + /// `n.reps(i => A(i))` or `n.reps(A)` the action `A`, `n` times. /// The iteration number, starting with 0, is passed as an argument of `A`. /// As actions are usually not parameterized by the iteration number, @@ -823,7 +845,7 @@ module builtin { /// /// ``` /// var x: int - /// run test = (x' = 0).then(3.times(x' = x + 1)).then(assert(x == 3)) + /// run test = (x' = 0).then(3.reps(x' = x + 1)).then(assert(x == 3)) /// ``` /// /// ``` @@ -835,6 +857,24 @@ module builtin { /// ``` action assert(p): (bool) => bool + /// `q::debug(msg, value)` prints the given message and value to the console, + /// separated by a space. + /// + /// It also returns the given value unchanged, + /// so that it can be used directly within expressions. + /// + /// ### Examples + /// + /// ``` + /// var x: int + /// >>> (x' = 0).then(3.reps(i => x' = q::debug("new x:", x + 1))) + /// > new x: 1 + /// > new x: 2 + /// > new x: 3 + /// true + /// ``` + pure def q::debug(msg, value): (str, a) => a + // /// `List(e0, ..., en)` is a list of values `e0`, ..., `en`. // /// // /// This is the list constructor. diff --git a/quint/src/cli.ts b/quint/src/cli.ts index 21df3eb7d..de485f4cb 100755 --- a/quint/src/cli.ts +++ b/quint/src/cli.ts @@ -9,12 +9,15 @@ * @author Igor Konnov, Gabriela Moreira, Shon Feder, Informal Systems, 2021-2023 */ +import { fail } from 'assert' import yargs from 'yargs/yargs' import { CLIProcedure, + compile, docs, load, + outputCompilationTarget, outputResult, parse, runRepl, @@ -34,6 +37,32 @@ const defaultOpts = (yargs: any) => type: 'string', }) +// Arguments used by routines that pass thru the `compile` stage +const compileOpts = (yargs: any) => + defaultOpts(yargs) + .option('main', { + desc: 'name of the main module (by default, computed from filename)', + type: 'string', + }) + .option('init', { + desc: 'name of the initializer action', + type: 'string', + default: 'init', + }) + .option('step', { + desc: 'name of the step action', + type: 'string', + default: 'step', + }) + .option('invariant', { + desc: 'the invariants to check, separated by commas (e.g.)', + type: 'string', + }) + .option('temporal', { + desc: 'the temporal properties to check, separated by commas', + type: 'string', + }) + // Chain async CLIProcedures // // This saves us having to manually thread the result argument like @@ -58,7 +87,7 @@ const parseCmd = { desc: 'name of the source map', type: 'string', }), - handler: async (args: any) => load(args).then(chainCmd(parse)).then(outputResult), + handler: (args: any) => load(args).then(chainCmd(parse)).then(outputResult), } // construct typecheck commands with yargs @@ -69,6 +98,38 @@ const typecheckCmd = { handler: (args: any) => load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(outputResult), } +const supportedTarges = ['tlaplus', 'json'] +// construct the compile subcommand +const compileCmd = { + command: 'compile ', + desc: 'compile a Quint specification into the target, the output is written to stdout', + builder: (yargs: any) => + compileOpts(yargs) + .option('target', { + desc: `the compilation target. Supported values: ${supportedTarges.join(', ')}`, + type: 'string', + default: 'json', + }) + .coerce('target', (target: string): string => { + if (!supportedTarges.includes(target)) { + fail(`Invalid option for --target: ${target}. Valid options: ${supportedTarges.join(', ')}`) + } + return target + }) + .option('verbosity', { + desc: 'control how much output is produced (0 to 5)', + type: 'number', + default: verbosity.defaultLevel, + }), + handler: (args: any) => + load(args) + .then(chainCmd(parse)) + .then(chainCmd(typecheck)) + .then(chainCmd(compile)) + .then(chainCmd(outputCompilationTarget)) + .then(outputResult), +} + // construct repl commands with yargs const replCmd = { command: ['repl', '*'], @@ -185,6 +246,11 @@ const runCmd = { desc: 'control how much output is produced (0 to 5)', type: 'number', default: verbosity.defaultLevel, + }) + .option('mbt', { + desc: '(experimental) whether to produce metadata to be used by model-based testing', + type: 'boolean', + default: false, }), // Timeouts are postponed for: // https://github.com/informalsystems/quint/issues/633 @@ -202,15 +268,7 @@ const verifyCmd = { command: 'verify ', desc: `Verify a Quint specification via Apalache`, builder: (yargs: any) => - yargs - .option('main', { - desc: 'name of the main module (by default, computed from filename)', - type: 'string', - }) - .option('out', { - desc: 'output file (suppresses all console output)', - type: 'string', - }) + compileOpts(yargs) .option('out-itf', { desc: 'output the trace in the Informal Trace Format to file (suppresses all console output)', type: 'string', @@ -220,26 +278,6 @@ const verifyCmd = { type: 'number', default: 10, }) - .option('init', { - desc: 'name of the initializer action', - type: 'string', - default: 'init', - }) - .option('step', { - desc: 'name of the step action', - type: 'string', - default: 'step', - }) - .option('invariant', { - desc: 'the invariants to check, separated by a comma', - type: 'string', - coerce: (s: string) => s.split(','), - }) - .option('temporal', { - desc: 'the temporal properties to check, separated by a comma', - type: 'string', - coerce: (s: string) => s.split(','), - }) .option('random-transitions', { desc: 'choose transitions at random (= use symbolic simulation)', type: 'boolean', @@ -262,7 +300,12 @@ const verifyCmd = { // type: 'number', // }) handler: (args: any) => - load(args).then(chainCmd(parse)).then(chainCmd(typecheck)).then(chainCmd(verifySpec)).then(outputResult), + load(args) + .then(chainCmd(parse)) + .then(chainCmd(typecheck)) + .then(chainCmd(compile)) + .then(chainCmd(verifySpec)) + .then(outputResult), } // construct documenting commands with yargs @@ -292,6 +335,7 @@ async function main() { await yargs(process.argv.slice(2)) .command(parseCmd) .command(typecheckCmd) + .command(compileCmd) .command(replCmd) .command(runCmd) .command(testCmd) diff --git a/quint/src/cliCommands.ts b/quint/src/cliCommands.ts index 06ab55abf..17182dbff 100644 --- a/quint/src/cliCommands.ts +++ b/quint/src/cliCommands.ts @@ -1,5 +1,5 @@ /** - * Define the commands for QuintC + * The commands for the quint CLI * * See the description at: * https://github.com/informalsystems/quint/blob/main/doc/quint.md @@ -24,11 +24,12 @@ import { } from './parsing/quintParserFrontend' import { ErrorMessage } from './ErrorMessage' +import { fail } from 'assert' import { Either, left, right } from '@sweet-monads/either' import { EffectScheme } from './effects/base' import { LookupTable, UnusedDefinitions } from './names/base' import { ReplOptions, quintRepl } from './repl' -import { OpQualifier, QuintEx, QuintModule, QuintOpDef, qualifier } from './ir/quintIr' +import { FlatModule, OpQualifier, QuintEx, QuintModule, QuintOpDef, qualifier } from './ir/quintIr' import { TypeScheme } from './types/base' import { createFinders, formatError } from './errorReporter' import { DocumentationEntry, produceDocs, toMarkdown } from './docs' @@ -43,12 +44,21 @@ import { Rng, newRng } from './rng' import { fileSourceResolver } from './parsing/sourceResolver' import { verify } from './quintVerifier' import { flattenModules } from './flattening/fullFlattener' -import { analyzeInc, analyzeModules } from './quintAnalyzer' +import { AnalysisOutput, analyzeInc, analyzeModules } from './quintAnalyzer' import { ExecutionFrame } from './runtime/trace' import { flow, isEqual, uniqWith } from 'lodash' import { Maybe, just, none } from '@sweet-monads/maybe' - -export type stage = 'loading' | 'parsing' | 'typechecking' | 'testing' | 'running' | 'documentation' +import { compileToTlaplus } from './compileToTlaplus' + +export type stage = + | 'loading' + | 'parsing' + | 'typechecking' + | 'testing' + | 'running' + | 'compiling' + | 'outputting target' + | 'documentation' /** The data from a ProcedureStage that may be output to --out */ interface OutputStage { @@ -65,8 +75,8 @@ interface OutputStage { passed?: string[] failed?: string[] ignored?: string[] - // Test names output produced by 'run' - status?: 'ok' | 'violation' | 'failure' + // Possible results from 'run' + status?: 'ok' | 'violation' | 'failure' | 'error' trace?: QuintEx[] /* Docstrings by definition name by module name */ documentation?: Map> @@ -136,6 +146,10 @@ interface TypecheckedStage extends ParsedStage { modes: Map } +interface CompiledStage extends TypecheckedStage, AnalysisOutput { + mainModule: FlatModule +} + interface TestedStage extends LoadedStage { // the names of the passed tests passed: string[] @@ -145,13 +159,8 @@ interface TestedStage extends LoadedStage { ignored: string[] } -interface SimulatorStage extends LoadedStage { - status: 'ok' | 'violation' | 'failure' - trace?: QuintEx[] -} - -interface VerifiedStage extends LoadedStage { - status: 'ok' | 'violation' | 'failure' +// Data resulting from stages that can produce a trace +interface TracingStage extends LoadedStage { trace?: QuintEx[] } @@ -260,12 +269,12 @@ export function mkErrorMessage(sourceMap: SourceMap): (_: QuintError) => ErrorMe */ export async function typecheck(parsed: ParsedStage): Promise> { const { table, modules, sourceMap } = parsed - const typechecking = { ...parsed, stage: 'typechecking' as stage } const [errorMap, result] = analyzeModules(table, modules) + const typechecking = { ...parsed, ...result, stage: 'typechecking' as stage } if (errorMap.length === 0) { - return right({ ...typechecking, ...result }) + return right(typechecking) } else { const errors = errorMap.map(mkErrorMessage(sourceMap)) return cliErr('typechecking failed', { ...typechecking, errors }) @@ -301,31 +310,16 @@ export async function runRepl(_argv: any) { * @param typedStage the procedure stage produced by `typecheck` */ export async function runTests(prev: TypecheckedStage): Promise> { - const verbosityLevel = !prev.args.out ? prev.args.verbosity : 0 - const out = console.log - const columns = !prev.args.out ? terminalWidth() : 80 - const testing = { ...prev, stage: 'testing' as stage } + const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) - const outputTemplate = testing.args.output - const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { return cliErr(rngOrError.value, { ...testing, errors: [] }) } const rng = rngOrError.unwrap() - let passed: string[] = [] - let failed: string[] = [] - let ignored: string[] = [] - let namedErrors: [string, ErrorMessage, TestResult][] = [] - - const startMs = Date.now() - if (verbosity.hasResults(verbosityLevel)) { - out(`\n ${mainName}`) - } - const matchFun = (n: string): boolean => isMatchingTest(testing.args.match, n) const options: TestOptions = { testMatch: matchFun, @@ -346,12 +340,26 @@ export async function runTests(prev: TypecheckedStage): Promise d.kind === 'def' && options.testMatch(d.name) ) - // Define name expressions referencing each test that is not referenced elsewhere, adding the references to the lookup // table const args: QuintEx[] = unusedTests.map(defToAdd => { @@ -362,7 +370,6 @@ export async function runTests(prev: TypecheckedStage): Promise m.name === mainName) main?.declarations.push(testDeclaration) + // TODO The following block should all be moved into compileAndTest const analysisOutput = { types: testing.types, effects: testing.effects, modes: testing.modes } const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( testing.modules, @@ -392,94 +399,115 @@ export async function runTests(prev: TypecheckedStage): Promise { - if (res.status === 'passed') { - out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) - } - if (res.status === 'failed') { - const errNo = chalk.red(namedErrors.length + 1) - out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) + const testResult = compileAndTest(compilationState, mainName, flattenedTable, options) - res.errors.forEach(e => namedErrors.push([res.name, mkErrorMessage(testing.sourceMap)(e), res])) - } - }) - } + // We have a compilation failure, so early exit without reporting test results + if (testResult.isLeft()) { + return cliErr('Tests could not be run due to an error during compilation', { + ...testing, + errors: testResult.value.map(mkErrorMessage(testing.sourceMap)), + }) + } - passed = results.filter(r => r.status === 'passed').map(r => r.name) - failed = results.filter(r => r.status === 'failed').map(r => r.name) - ignored = results.filter(r => r.status === 'ignored').map(r => r.name) + // We're finished running the tests + const elapsedMs = Date.now() - startMs + // So we can analyze the results now + const results = testResult.value - // output the statistics banner - if (verbosity.hasResults(verbosityLevel)) { - out('') - if (passed.length > 0) { - out(chalk.green(` ${passed.length} passing`) + chalk.gray(` (${elapsedMs}ms)`)) - } - if (failed.length > 0) { - out(chalk.red(` ${failed.length} failed`)) + // output the status for every test + let nFailures = 1 + if (verbosity.hasResults(verbosityLevel)) { + results.forEach(res => { + if (res.status === 'passed') { + out(` ${chalk.green('ok')} ${res.name} passed ${res.nsamples} test(s)`) } - if (ignored.length > 0) { - out(chalk.gray(` ${ignored.length} ignored`)) + if (res.status === 'failed') { + const errNo = chalk.red(nFailures) + out(` ${errNo}) ${res.name} failed after ${res.nsamples} test(s)`) + nFailures++ } - } + }) + } - // output errors, if there are any - if (verbosity.hasTestDetails(verbosityLevel) && namedErrors.length > 0) { - const code = prev.sourceCode! - const finders = createFinders(code) - out('') - namedErrors.forEach(([name, err, testResult], index) => { - const details = formatError(code, finders, err) - // output the header - out(` ${index + 1}) ${name}:`) - const lines = details.split('\n') - // output the first two lines in red - lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) - - if (verbosity.hasActionTracking(verbosityLevel)) { - out('') - testResult.frames.forEach((f, index) => { - out(`[${chalk.bold('Frame ' + index)}]`) - const console = { - width: columns, - out: (s: string) => process.stdout.write(s), - } - printExecutionFrameRec(console, f, []) - out('') - }) - - if (testResult.frames.length == 0) { - out(' [No execution]') - } - } - // output the seed - out(chalk.gray(` Use --seed=0x${testResult.seed.toString(16)} --match=${testResult.name} to repeat.`)) - }) - out('') - } + const passed = results.filter(r => r.status === 'passed') + const failed = results.filter(r => r.status === 'failed') + const ignored = results.filter(r => r.status === 'ignored') + const namedErrors: [TestResult, ErrorMessage][] = failed.reduce( + (acc: [TestResult, ErrorMessage][], failure) => + acc.concat(failure.errors.map(e => [failure, mkErrorMessage(testing.sourceMap)(e)])), + [] + ) - if (failed.length > 0 && verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { - out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) - out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) + // output the statistics banner + if (verbosity.hasResults(verbosityLevel)) { + out('') + if (passed.length > 0) { + out(chalk.green(` ${passed.length} passing`) + chalk.gray(` (${elapsedMs}ms)`)) + } + if (failed.length > 0) { + out(chalk.red(` ${failed.length} failed`)) + } + if (ignored.length > 0) { + out(chalk.gray(` ${ignored.length} ignored`)) } } - const errors = namedErrors.map(([_, e]) => e) - const stage = { ...testing, passed, failed, ignored, errors } - if (errors.length == 0 && failed.length == 0) { + const stage = { + ...testing, + passed: passed.map(r => r.name), + failed: failed.map(r => r.name), + ignored: ignored.map(r => r.name), + errors: namedErrors.map(([_, e]) => e), + } + + // Nothing failed, so we are OK, and can exit early + if (failed.length === 0) { return right(stage) - } else { - return cliErr('Tests failed', stage) } + + // We know that there are errors, so report as required by the verbosity configuration + if (verbosity.hasTestDetails(verbosityLevel)) { + const code = prev.sourceCode! + const finders = createFinders(code) + const columns = !prev.args.out ? terminalWidth() : 80 + out('') + namedErrors.forEach(([testResult, err], index) => { + const details = formatError(code, finders, err) + // output the header + out(` ${index + 1}) ${testResult.name}:`) + const lines = details.split('\n') + // output the first two lines in red + lines.slice(0, 2).forEach(l => out(chalk.red(' ' + l))) + + if (verbosity.hasActionTracking(verbosityLevel)) { + out('') + testResult.frames.forEach((f, index) => { + out(`[${chalk.bold('Frame ' + index)}]`) + const console = { + width: columns, + out: (s: string) => process.stdout.write(s), + } + printExecutionFrameRec(console, f, []) + out('') + }) + + if (testResult.frames.length == 0) { + out(' [No execution]') + } + } + // output the seed + out(chalk.gray(` Use --seed=0x${testResult.seed.toString(16)} --match=${testResult.name} to repeat.`)) + }) + out('') + } + + if (verbosity.hasHints(options.verbosity) && !verbosity.hasActionTracking(options.verbosity)) { + out(chalk.gray(`\n Use --verbosity=3 to show executions.`)) + out(chalk.gray(` Further debug with: quint --verbosity=3 ${prev.args.input}`)) + } + + return cliErr('Tests failed', stage) } // Print a counterexample if the appropriate verbosity is set @@ -499,15 +527,17 @@ function maybePrintCounterExample(verbosityLevel: number, states: QuintEx[], fra * * @param prev the procedure stage produced by `typecheck` */ -export async function runSimulator(prev: TypecheckedStage): Promise> { +export async function runSimulator(prev: TypecheckedStage): Promise> { const simulator = { ...prev, stage: 'running' as stage } + const verbosityLevel = deriveVerbosity(prev.args) const mainName = guessMainModule(prev) - const verbosityLevel = !prev.args.out && !prev.args.outItf ? prev.args.verbosity : 0 + const rngOrError = mkRng(prev.args.seed) if (rngOrError.isLeft()) { return cliErr(rngOrError.value, { ...simulator, errors: [] }) } const rng = rngOrError.unwrap() + const options: SimulatorOptions = { init: prev.args.init, step: prev.args.step, @@ -516,7 +546,9 @@ export async function runSimulator(prev: TypecheckedStage): Promise> { - const verifying = { ...prev, stage: 'verifying' as stage } - const args = verifying.args - let loadedConfig: any = {} - try { - if (args.apalacheConfig) { - loadedConfig = JSON.parse(readFileSync(args.apalacheConfig, 'utf-8')) - } - } catch (err: any) { - return cliErr(`failed to read Apalache config: ${err.message}`, { ...verifying, errors: [], sourceCode: new Map() }) - } - - const mainArg = prev.args.main - const mainName = mainArg ? mainArg : basename(prev.args.input, '.qnt') - const main = verifying.modules.find(m => m.name === mainName) +export async function compile(typechecked: TypecheckedStage): Promise> { + const args = typechecked.args + const mainName = guessMainModule(typechecked) + const main = typechecked.modules.find(m => m.name === mainName) if (!main) { - return cliErr(`module ${mainName} does not exist`, { ...verifying, errors: [], sourceCode: new Map() }) + return cliErr(`module ${mainName} does not exist`, { ...typechecked, errors: [], sourceCode: new Map() }) } // Wrap init, step, invariant and temporal properties in other definitions, // to make sure they are not considered unused in the main module and, // therefore, ignored by the flattener const extraDefsAsText = [`action q::init = ${args.init}`, `action q::step = ${args.step}`] + if (args.invariant) { - extraDefsAsText.push(`val q::inv = and(${args.invariant.join(',')})`) + extraDefsAsText.push(`val q::inv = and(${args.invariant})`) } if (args.temporal) { - extraDefsAsText.push(`temporal q::temporalProps = and(${args.temporal.join(',')})`) + extraDefsAsText.push(`temporal q::temporalProps = and(${args.temporal})`) } - const extraDefs = extraDefsAsText.map(d => parseDefOrThrow(d, verifying.idGen, new Map())) + const extraDefs = extraDefsAsText.map(d => parseDefOrThrow(d, typechecked.idGen, new Map())) main.declarations.push(...extraDefs) // We have to update the lookup table and analysis result with the new definitions. This is not ideal, and the problem // is that is hard to add this definitions in the proper stage, in our current setup. We should try to tackle this // while solving #1052. - const resolutionResult = parsePhase3importAndNameResolution({ ...prev, errors: [] }) + const resolutionResult = parsePhase3importAndNameResolution({ ...typechecked, errors: [] }) if (resolutionResult.errors.length > 0) { - const errors = resolutionResult.errors.map(mkErrorMessage(prev.sourceMap)) - return cliErr('name resolution failed', { ...verifying, errors }) + const errors = resolutionResult.errors.map(mkErrorMessage(typechecked.sourceMap)) + return cliErr('name resolution failed', { ...typechecked, errors }) } - verifying.table = resolutionResult.table - analyzeInc(verifying, verifying.table, extraDefs) + typechecked.table = resolutionResult.table + analyzeInc(typechecked, typechecked.table, extraDefs) // Flatten modules, replacing instances, imports and exports with their definitions const { flattenedModules, flattenedTable, flattenedAnalysis } = flattenModules( - verifying.modules, - verifying.table, - verifying.idGen, - verifying.sourceMap, - verifying + typechecked.modules, + typechecked.table, + typechecked.idGen, + typechecked.sourceMap, + typechecked ) - // Pick main module, we only pass this on to Apalache + // Pick the main module const flatMain = flattenedModules.find(m => m.name === mainName)! - const veryfiyingFlat = { ...verifying, ...flattenedAnalysis, modules: [flatMain], table: flattenedTable } + return right({ + ...typechecked, + ...flattenedAnalysis, + mainModule: flatMain, + table: flattenedTable, + stage: 'compiling', + }) +} + +/** output a compiled spec in the format specified in the `compiled.args.target` to stdout + * + * @param compiled The result of a preceding compile stage + */ +export async function outputCompilationTarget(compiled: CompiledStage): Promise> { + const stage: stage = 'outputting target' + const args = compiled.args + const verbosityLevel = deriveVerbosity(args) + + const parsedSpecJson = jsonStringOfOutputStage(pickOutputStage({ ...compiled, modules: [compiled.mainModule] })) + switch ((compiled.args.target as string).toLowerCase()) { + case 'json': + process.stdout.write(parsedSpecJson) + return right(compiled) + case 'tlaplus': { + const toTlaResult = await compileToTlaplus(parsedSpecJson, verbosityLevel) + return toTlaResult + .mapRight(tla => { + process.stdout.write(tla) // Write out, since all went right + return compiled + }) + .mapLeft(err => { + return { + msg: err.explanation, + stage: { ...compiled, stage, status: 'error', errors: err.errors }, + } + }) + } + default: + // This is validated in the arg parsing + fail(`Invalid option for --target`) + } +} + +/** + * Verify a spec via Apalache. + * + * @param prev the procedure stage produced by `typecheck` + */ +export async function verifySpec(prev: CompiledStage): Promise> { + const verifying = { ...prev, stage: 'verifying' as stage } + const args = verifying.args + const verbosityLevel = deriveVerbosity(args) + + let loadedConfig: any = {} + try { + if (args.apalacheConfig) { + loadedConfig = JSON.parse(readFileSync(args.apalacheConfig, 'utf-8')) + } + } catch (err: any) { + return cliErr(`failed to read Apalache config: ${err.message}`, { ...verifying, errors: [], sourceCode: new Map() }) + } + + const veryfiyingFlat = { ...prev, modules: [prev.mainModule] } const parsedSpec = jsonStringOfOutputStage(pickOutputStage(veryfiyingFlat)) // We need to insert the data form CLI args into their appropriate locations @@ -677,7 +763,6 @@ export async function verifySpec(prev: TypecheckedStage): Promise { const elapsedMs = Date.now() - startMs return res @@ -689,7 +774,7 @@ export async function verifySpec(prev: TypecheckedStage): Promise { const trace: QuintEx[] | undefined = err.traces ? ofItf(err.traces[0]) : undefined @@ -817,7 +902,7 @@ function addItfHeader(source: string, status: string, traceInJson: any): any { // Preprocess troublesome types so they are represented in JSON. // -// We need it particularly because, by default, serialization of Map +// We need it particularly because, by default, serialization of Map and Set // objects just produces an empty object // (see https://stackoverflow.com/questions/46634449/json-stringify-of-object-of-map-return-empty) // @@ -826,6 +911,9 @@ function replacer(_key: String, value: any): any { if (value instanceof Map) { // Represent Maps as JSON objects return Object.fromEntries(value) + } else if (value instanceof Set) { + // Represent Sets as JSON arrays + return Array.from(value) } else { return value } @@ -862,3 +950,8 @@ function isMatchingTest(match: string | undefined, name: string) { return name.endsWith('Test') } } + +// Derive the verbosity for simulation and verification routines +function deriveVerbosity(args: { out: string | undefined; outItf: string | undefined; verbosity: number }): number { + return !args.out && !args.outItf ? args.verbosity : 0 +} diff --git a/quint/src/compileToTlaplus.ts b/quint/src/compileToTlaplus.ts new file mode 100644 index 000000000..4df0a7995 --- /dev/null +++ b/quint/src/compileToTlaplus.ts @@ -0,0 +1,36 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Use apalache to convert quint parse data into TLA+ + * + * @author Shon Feder + * + * @module + */ + +import { ApalacheResult, connect } from './apalache' + +/** + * Get apalache to convert quint parse data into TLA+ + * + * @param parseDataJson the flattened, analyzed, parse data, in as a json string + * + * @returns right(tlaString) if parsing succeeds, or left(err) explaining the failure + */ +export async function compileToTlaplus(parseDataJson: string, verbosityLevel: number): Promise> { + const config = { + input: { + source: { + type: 'string', + format: 'qnt', + content: parseDataJson, + }, + }, + } + const connectionResult = await connect(verbosityLevel) + return connectionResult.asyncChain(conn => conn.tla(config)) +} diff --git a/quint/src/effects/NondetChecker.ts b/quint/src/effects/NondetChecker.ts new file mode 100644 index 000000000..9952e61ef --- /dev/null +++ b/quint/src/effects/NondetChecker.ts @@ -0,0 +1,119 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Checking for the misuse of 'nondet' and 'oneOf'. Necessary to ensure they are + * compatible with the exists operator from TLA+. + * + * @author Gabriela Moreira + * + * @module + */ + +import { IRVisitor, walkDeclaration } from '../ir/IRVisitor' +import { OpQualifier, QuintApp, QuintDeclaration, QuintLet, QuintOpDef } from '../ir/quintIr' +import { LookupTable } from '../names/base' +import { QuintError } from '../quintError' +import { TypeScheme } from '../types/base' +import { typeSchemeToString } from '../types/printing' + +export class NondetChecker implements IRVisitor { + private table: LookupTable + private types: Map = new Map() + private lastDefQualifier: OpQualifier = 'def' + + private errors: QuintError[] = [] + + constructor(table: LookupTable) { + this.table = table + } + + /** + * Checks declarations for misuse of 'nondet' and 'oneOf'. + * + * @param types - the types of the declarations + * @param declarations - the declarations to check + * + * @returns a list of errors (empty if no errors are found) + */ + checkNondets(types: Map, declarations: QuintDeclaration[]): QuintError[] { + this.types = types + + declarations.forEach(d => walkDeclaration(this, d)) + return this.errors + } + + enterOpDef(def: QuintOpDef) { + this.lastDefQualifier = def.qualifier + + const entry = this.table.get(def.id) + if (!entry) { + // A name resolution error should have been reported already + return + } + + if (def.qualifier === 'nondet' && entry.depth === 0) { + this.errors.push({ + code: 'QNT206', + message: `'nondet' can only be used inside actions, not at the top level`, + reference: def.id, + data: {}, + }) + } + } + + enterApp(app: QuintApp) { + if (app.opcode !== 'oneOf') { + // nothing to check + return + } + + if (this.lastDefQualifier !== 'nondet') { + this.errors.push({ + code: 'QNT203', + message: `'oneOf' must be used inside a nondet definition`, + reference: app.id, + data: {}, + }) + return + } + } + + enterLet(expr: QuintLet) { + if (expr.opdef.qualifier !== 'nondet') { + return + } + + // body of nondet must be an application of oneOf + const body = expr.opdef.expr + if (body.kind !== 'app' || body.opcode !== 'oneOf') { + this.errors.push({ + code: 'QNT204', + message: `'oneOf' must be the outermost expression in a nondet definition`, + reference: body.id, + data: {}, + }) + } + + // if the opdef is nondet, the return type must be bool + const expressionType = this.types.get(expr.expr.id) + if (!expressionType) { + // A type error should have been reported already + return + } + + if (expressionType.type.kind !== 'bool') { + this.errors.push({ + code: 'QNT205', + message: `nondet bindings can only be used with boolean expressions, but expression has type: ${typeSchemeToString( + expressionType + )}`, + reference: expr.id, + data: {}, + }) + } + } +} diff --git a/quint/src/effects/base.ts b/quint/src/effects/base.ts index 1b466a7c0..73b5bf94f 100644 --- a/quint/src/effects/base.ts +++ b/quint/src/effects/base.ts @@ -81,11 +81,11 @@ export interface StateVariable { * entity variable or a combination of other entities. */ export type Entity = - /* A list of state variables */ + /* A set of state variables, represented as a list */ | { kind: 'concrete'; stateVariables: StateVariable[] } - /* A variable representing some entity */ + /* A variable representing some set of entities */ | { kind: 'variable'; name: string; reference?: bigint } - /* A combination of entities */ + /* The union of sets of entities, represented as a list */ | { kind: 'union'; entities: Entity[] } /* @@ -177,11 +177,36 @@ function bindEffect(name: string, effect: Effect): Either } } -function bindEntity(name: string, entity: Entity): Either { - if (entityNames(entity).includes(name)) { - return left(`Can't bind ${name} to ${entityToString(entity)}: cyclical binding`) - } else { - return right([{ kind: 'entity', name, value: entity }]) +function bindEntity(name: string, entity: Entity): Substitutions { + switch (entity.kind) { + case 'concrete': + case 'variable': + return [{ kind: 'entity', name, value: entity }] + case 'union': + if (entityNames(entity).includes(name)) { + // An entity variable (which always stands for a set of state variables) + // unifies with the union of n sets of entities that may include itself, + // iff it unifies with each set. + // + // I.e.: + // + // (v1 =.= v1 ∪ ... ∪ vn) <=> (v1 =.= ... =.= vn) + // + // We call this function recursively because, in the general case, + // occurrences of `v1` may be nested, as in: + // + // v1 =.= v1 ∪ (v2 ∪ (v3 ∪ v1)) ∪ v4 + // + // In practice, we are flattening unions before we call this function, + // but solving the general case ensures we preserve correct behavior + // even if this function is used on its own, without incurring any + // notable overhead when `entities` is already flat. + return entity.entities.flatMap(e => bindEntity(name, e)) + } else { + // Otherwise, the variable may be bound to the union of the entities + // without qualification. + return [{ kind: 'entity', name, value: entity }] + } } } @@ -321,9 +346,9 @@ export function unifyEntities(va: Entity, vb: Entity): Either buildErrorLeaf(location, msg)) + return right(bindEntity(v1.name, v2)) } else if (v2.kind === 'variable') { - return bindEntity(v2.name, v1).mapLeft(msg => buildErrorLeaf(location, msg)) + return right(bindEntity(v2.name, v1)) } else if (isEqual(v1, v2)) { return right([]) } else if (v1.kind === 'union' && v2.kind === 'concrete') { diff --git a/quint/src/effects/builtinSignatures.ts b/quint/src/effects/builtinSignatures.ts index a562851cc..1938d6405 100644 --- a/quint/src/effects/builtinSignatures.ts +++ b/quint/src/effects/builtinSignatures.ts @@ -219,9 +219,12 @@ const temporalOperators = [ const otherOperators = [ { name: 'assign', effect: parseAndQuantify('(Read[r1], Read[r2]) => Read[r2] & Update[r1]') }, { name: 'then', effect: parseAndQuantify('(Read[r1] & Update[u], Read[r2] & Update[u]) => Read[r] & Update[u]') }, + { name: 'expect', effect: parseAndQuantify('(Read[r1] & Update[u], Read[r2]) => Read[r1] & Update[u]') }, { name: 'reps', effect: parseAndQuantify('(Pure, (Read[r1]) => Read[r2] & Update[u]) => Read[r1, r2] & Update[u]') }, { name: 'fail', effect: propagateComponents(['read', 'update'])(1) }, { name: 'assert', effect: propagateComponents(['read'])(1) }, + { name: 'q::debug', effect: propagateComponents(['read'])(2) }, + { name: 'q::lastTrace', effect: parseAndQuantify('Pure') }, // FIXME: Should be in run mode { name: 'ite', effect: parseAndQuantify('(Read[r1], Read[r2] & Update[u], Read[r3] & Update[u]) => Read[r1, r2, r3] & Update[u]'), diff --git a/quint/src/effects/inferrer.ts b/quint/src/effects/inferrer.ts index 0338a593e..61538f38d 100644 --- a/quint/src/effects/inferrer.ts +++ b/quint/src/effects/inferrer.ts @@ -37,7 +37,8 @@ import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } f import { getSignatures, standardPropagation } from './builtinSignatures' import { FreshVarGenerator } from '../FreshVarGenerator' import { effectToString } from './printing' -import { zip } from 'lodash' +import { zip } from '../util' +import { addNamespaces } from './namespaces' export type EffectInferenceResult = [Map, Map] @@ -55,8 +56,9 @@ export class EffectInferrer implements IRVisitor { } /** - * Infers an effect for every expression in a module based on - * the definitions table for that module + * Infers an effect for every expression in a module based on the definitions + * table for that module. If there are missing effects in the effect map, + * there will be at least one error. * * @param declarations: the list of QuintDeclarations to infer effects for * @@ -87,6 +89,8 @@ export class EffectInferrer implements IRVisitor { private freeNames: { effectVariables: Set; entityVariables: Set }[] = [] // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 enterExpr(e: QuintEx) { @@ -182,11 +186,6 @@ export class EffectInferrer implements IRVisitor { effects, expr.args.map(a => a.id) ).forEach(([effect, id]) => { - if (!effect || !id) { - // Impossible: effects and expr.args are the same length - throw new Error(`Expected ${expr.args.length} effects, but got ${effects.length}`) - } - const r = applySubstitution(s, effect).map(toScheme) this.addToResults(id, r) }) @@ -361,7 +360,18 @@ export class EffectInferrer implements IRVisitor { } return this.fetchResult(id).map(e => { - return this.newInstance(e) + const effect = this.newInstance(e) + if (def.importedFrom?.kind === 'instance') { + // Names imported from instances might have effects that refer to + // names that are shared between multiple instances. To properly infer + // effects refering to those state variables, they need to be + // namespaced in a way that makes them different between different + // instances. For that, we use the namespaces attribute from lookup + // table definition, which contains the proper namespaces to identify + // unique names while flattening. + return addNamespaces(effect, def.namespaces ?? []) + } + return effect }) } } diff --git a/quint/src/effects/namespaces.ts b/quint/src/effects/namespaces.ts new file mode 100644 index 000000000..04086addd --- /dev/null +++ b/quint/src/effects/namespaces.ts @@ -0,0 +1,68 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2023 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Updating effects with namespaces for state variables. To be used when a module with variables is instantiated. + * + * @author Gabriela Moreira + * + * @module + */ +import { Effect, Entity } from './base' + +/** + * Adds a namespace, in the format of the namespaces attribute in LookupDefinition, to all state variables in an effect. + * + * @param effect - The effect to add the namespaces to + * @param namespaces - The namespaces to add + * + * @return The effect with namespaces added to all state variables + */ +export function addNamespaces(effect: Effect, namespaces: string[]): Effect { + switch (effect.kind) { + case 'variable': { + return effect + } + case 'arrow': { + return { + ...effect, + params: effect.params.map(p => addNamespaces(p, namespaces)), + result: addNamespaces(effect.result, namespaces), + } + } + case 'concrete': { + return { + ...effect, + components: effect.components.map(c => ({ ...c, entity: addNamespacesToEntity(c.entity, namespaces) })), + } + } + } +} + +function addNamespacesToEntity(entity: Entity, namespaces: string[]): Entity { + switch (entity.kind) { + case 'variable': { + return entity + } + case 'union': { + return { ...entity, entities: entity.entities.map(p => addNamespacesToEntity(p, namespaces)) } + } + case 'concrete': { + if (namespaces.length === 0) { + return entity + } + + const pathPrefix = namespaces.reduce((a, b) => `${b}::${a}`) + return { + ...entity, + stateVariables: entity.stateVariables.map(v => ({ + ...v, + name: `${pathPrefix}::${v.name}`, + })), + } + } + } +} diff --git a/quint/src/flattening/flattener.ts b/quint/src/flattening/flattener.ts index af5a32da4..f644eb1af 100644 --- a/quint/src/flattening/flattener.ts +++ b/quint/src/flattening/flattener.ts @@ -207,9 +207,9 @@ class Flattener implements IRVisitor { } export function getNamespaceForDef(def: LookupDefinition): string | undefined { - if (!def.namespaces) { + if (!def.namespaces || def.namespaces.length === 0) { return } - return [...def.namespaces].reverse().join('::') + return def.namespaces.reduce((a, b) => `${b}::${a}`) } diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index c0a15396f..ebeba8455 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -6,7 +6,7 @@ * 2. Make it expressive enough to capture all of the TLA logic. * * @author: Igor Konnov, Shon Feder, Gabriela Moreira, Jure Kukovec, Thomas Pani - * Informal Systems, 2021-2023 + * Informal Systems, 2021-2024 */ grammar Quint; @@ -25,44 +25,52 @@ documentedDeclaration : DOCCOMMENT* declaration; // a module declaration declaration : 'const' qualId ':' type # const | 'var' qualId ':' type # var - | 'assume' identOrHole '=' expr # assume + | 'assume' (assumeName=identOrHole) '=' expr # assume | instanceMod # instance | operDef # oper | typeDef # typeDefs | importMod # importDef | exportMod # exportDef - // https://github.com/informalsystems/quint/issues/378 - //| 'nondet' qualId (':' type)? '=' expr ';'? expr { - // const m = "QNT007: 'nondet' is only allowed inside actions" - // this.notifyErrorListeners(m) - //} # nondetError ; // An operator definition. -// We embed two kinds of parameters right in this rule. -// Otherwise, the parser would start recognizing parameters everywhere. -operDef : qualifier normalCallName - ( /* ML-like parameter lists */ - '(' (parameter (',' parameter)*)? ')' (':' type)? - | ':' type - /* C-like parameter lists */ - | '(' (parameter ':' type (',' parameter ':' type)*) ')' ':' type - )? - ('=' expr)? ';'? - ; +operDef + : qualifier normalCallName + // Fully-annotated parameter list with at least one parameter + '(' (annotOperParam+=annotatedParameter (',' annotOperParam+=annotatedParameter)*) ')' + // Mandatory annotation for return type + ':' type + // We support header declaration with no implementation for documentation genaration + ('=' expr)? + // Optionally terminated with a semicolon + ';'? + # annotatedOperDef + | qualifier normalCallName // TODO: Remove as per https://github.com/informalsystems/quint/issues/923 + // Unannotated parameter list + ('(' (operParam+=parameter (',' operParam+=parameter)*)? ')')? + // Optional type annotation using the deprecated format + (':' annotatedRetType=type)? + // We support header declaration with no implementation for documentation genaration + ('=' expr)? + // Optionally terminated with a semicolon + ';'? + # deprecatedOperDef + ; typeDef - : 'type' qualId # typeAbstractDef - | 'type' qualId '=' type # typeAliasDef - | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef + : 'type' qualId # typeAbstractDef + | 'type' typeDefHead '=' type # typeAliasDef + | 'type' typeDefHead '=' sumTypeDefinition # typeSumDef ; +typeDefHead : typeName=qualId ('[' typeVars+=LOW_ID(',' typeVars+=LOW_ID)* ']')?; + +sumTypeDefinition : '|'? typeSumVariant ('|' typeSumVariant)* ; + // A single variant case in a sum type definition or match statement. // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; -nondetOperDef : 'nondet' qualId (':' type)? '=' expr ';'?; - qualifier : 'val' | 'def' | 'pure' 'val' @@ -70,6 +78,7 @@ qualifier : 'val' | 'action' | 'run' | 'temporal' + | 'nondet' ; importMod : 'import' name '.' identOrStar ('from' fromSource)? @@ -96,27 +105,34 @@ qualifiedName : qualId; fromSource: STRING; // Types in Type System 1.2 of Apalache -type : type '->' type # typeFun - | type '=>' type # typeOper - | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper - | SET '[' type ']' # typeSet - | LIST '[' type ']' # typeList - | '(' type ',' type (',' type)* ','? ')' # typeTuple - | '{' row '}' # typeRec - | 'int' # typeInt - | 'str' # typeStr - | 'bool' # typeBool - | qualId # typeConstOrVar - | '(' type ')' # typeParen - ; +type + : type '->' type # typeFun + | type '=>' type # typeOper + | '(' (type (',' type)*)? ','? ')' '=>' type # typeOper + // TODO: replace Set with general type application + | SET '[' type ']' # typeSet + // TODO: replace List with general type application + | LIST '[' type ']' # typeList + // Parse tuples of size 0 or 2+, but not 1. (int) should be parsed as int. + | '(' ')' # typeUnit + | '(' type ',' type (',' type)* ','? ')' # typeTuple + | '{' row? '}' # typeRec + | 'int' # typeInt + | 'str' # typeStr + | 'bool' # typeBool + | typeVar # typeVarCase + | qualId # typeConst + | '(' type ')' # typeParen + | typeCtor=qualId ('[' typeArg+=type (',' typeArg+=type)* ']') # typeApp + ; -row : (rowLabel ':' type ',')* ((rowLabel ':' type) (',' | '|' (rowVar=IDENTIFIER))?)? - | '|' (rowVar=IDENTIFIER) +typeVar: LOW_ID; +row : (rowLabel ':' type) (',' rowLabel ':' type)* (',' | '|' (rowVar=identifier))? + | '|' (rowVar=identifier) ; rowLabel : simpleId["record"] ; - // A Quint expression. The order matters, it defines the priority. // Wherever possible, we keep the same order of operators as in TLA+. // We are also trying to be consistent with mainstream languages, e.g., @@ -156,8 +172,9 @@ expr: // apply a built-in operator via the dot notation | 'all' '{' expr (',' expr)* ','? '}' # actionAll | 'any' '{' expr (',' expr)* ','? '}' # actionAny | ( qualId | INT | BOOL | STRING) # literalOrId - // a tuple constructor, the form tup(...) is just an operator call + // a tuple constructor, the form Tup(...) is just an operator call | '(' expr ',' expr (',' expr)* ','? ')' # tuple + | '(' ')' # unit // short-hand syntax for pairs, mainly designed for maps | expr '->' expr # pair | '{' recElem (',' recElem)* ','? '}' # record @@ -165,7 +182,6 @@ expr: // apply a built-in operator via the dot notation | '[' (expr (',' expr)*)? ','? ']' # list | 'if' '(' expr ')' expr 'else' expr # ifElse | operDef expr # letIn - | nondetOperDef expr # nondet | '(' expr ')' # paren | '{' expr '}' # braces ; @@ -196,10 +212,12 @@ lambdaUnsugared : parameter '=>' expr lambdaTupleSugar : '(' '(' parameter (',' parameter)+ ')' ')' '=>' expr; // an identifier or a hole '_' -identOrHole : '_' | qualId - ; +identOrHole : '_' | qualId; -parameter: identOrHole; +// TODO: Combine these into a single rule that support optionally annotated parameters +// Requires https://github.com/informalsystems/quint/issues/923 +parameter: paramName=identOrHole; +annotatedParameter: paramName=identOrHole ':' type; // an identifier or a star '*' identOrStar : '*' | qualId @@ -235,10 +253,11 @@ literal: (STRING | BOOL | INT) ; // A (possibly) qualified identifier, like `Foo` or `Foo::bar` -qualId : IDENTIFIER ('::' IDENTIFIER)* ; +qualId : identifier ('::' identifier)* ; + // An unqualified identifier that raises an error if a qualId is supplied simpleId[context: string] - : IDENTIFIER + : identifier | qualId { const err = quintErrorToString( { code: 'QNT008', @@ -249,6 +268,8 @@ simpleId[context: string] } ; +identifier : LOW_ID | CAP_ID; + // TOKENS // literals @@ -265,8 +286,6 @@ AND : 'and' ; OR : 'or' ; IFF : 'iff' ; IMPLIES : 'implies' ; -SET : 'Set' ; -LIST : 'List' ; MAP : 'Map' ; MATCH : 'match' ; PLUS : '+' ; @@ -283,9 +302,13 @@ EQ : '==' ; ASGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; +SET : 'Set'; +LIST : 'List'; -// other TLA+ identifiers -IDENTIFIER : ([a-zA-Z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; +// An identifier starting with lowercase +LOW_ID : ([a-z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; +// An identifier starting with uppercase +CAP_ID : ([A-Z][a-zA-Z0-9_]*|[_][a-zA-Z0-9_]+) ; DOCCOMMENT : '///' .*? '\n'; diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 08276dcf9..557f4271e 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -10,14 +10,16 @@ null ',' ';' 'type' +'[' +']' '|' -'nondet' 'val' 'def' 'pure' 'action' 'run' 'temporal' +'nondet' 'import' '.' 'from' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,9 @@ null '=' '(' ')' +'Set' +'List' +null null null null @@ -118,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -136,7 +135,10 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +SET +LIST +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -149,8 +151,9 @@ documentedDeclaration declaration operDef typeDef +typeDefHead +sumTypeDefinition typeSumVariant -nondetOperDef qualifier importMod exportMod @@ -160,6 +163,7 @@ name qualifiedName fromSource type +typeVar row rowLabel expr @@ -172,6 +176,7 @@ lambdaUnsugared lambdaTupleSugar identOrHole parameter +annotatedParameter identOrStar argList recElem @@ -181,7 +186,8 @@ operator literal qualId simpleId +identifier atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 753, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 3, 2, 6, 2, 80, 10, 2, 13, 2, 14, 2, 81, 3, 2, 3, 2, 3, 3, 7, 3, 87, 10, 3, 12, 3, 14, 3, 90, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 96, 10, 3, 12, 3, 14, 3, 99, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 104, 10, 4, 12, 4, 14, 4, 107, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 131, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 139, 10, 6, 12, 6, 14, 6, 142, 11, 6, 5, 6, 144, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 149, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 162, 10, 6, 12, 6, 14, 6, 165, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 171, 10, 6, 3, 6, 3, 6, 5, 6, 175, 10, 6, 3, 6, 5, 6, 178, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 191, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 196, 10, 7, 12, 7, 14, 7, 199, 11, 7, 5, 7, 201, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 208, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 214, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 219, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 230, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 238, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 244, 10, 11, 3, 11, 3, 11, 5, 11, 248, 10, 11, 5, 11, 250, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 261, 10, 12, 5, 12, 263, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 276, 10, 13, 12, 13, 14, 13, 279, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 286, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 299, 10, 13, 12, 13, 14, 13, 302, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 309, 10, 13, 5, 13, 311, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 326, 10, 18, 12, 18, 14, 18, 329, 11, 18, 5, 18, 331, 10, 18, 3, 18, 5, 18, 334, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 355, 10, 18, 12, 18, 14, 18, 358, 11, 18, 3, 18, 5, 18, 361, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 377, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 385, 10, 18, 12, 18, 14, 18, 388, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 395, 10, 19, 12, 19, 14, 19, 398, 11, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 407, 10, 19, 5, 19, 409, 10, 19, 3, 19, 3, 19, 5, 19, 413, 10, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 422, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 438, 10, 21, 12, 21, 14, 21, 441, 11, 21, 3, 21, 5, 21, 444, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 453, 10, 21, 12, 21, 14, 21, 456, 11, 21, 3, 21, 5, 21, 459, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 469, 10, 21, 12, 21, 14, 21, 472, 11, 21, 3, 21, 5, 21, 475, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 484, 10, 21, 12, 21, 14, 21, 487, 11, 21, 3, 21, 5, 21, 490, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 498, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 506, 10, 21, 12, 21, 14, 21, 509, 11, 21, 3, 21, 5, 21, 512, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 520, 10, 21, 12, 21, 14, 21, 523, 11, 21, 3, 21, 5, 21, 526, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 534, 10, 21, 12, 21, 14, 21, 537, 11, 21, 5, 21, 539, 10, 21, 3, 21, 5, 21, 542, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 567, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 606, 10, 21, 3, 21, 5, 21, 609, 10, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 616, 10, 21, 12, 21, 14, 21, 619, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 625, 10, 22, 3, 22, 3, 22, 3, 22, 7, 22, 630, 10, 22, 12, 22, 14, 22, 633, 11, 22, 3, 22, 3, 22, 3, 23, 3, 23, 5, 23, 639, 10, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 648, 10, 24, 3, 24, 5, 24, 651, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 662, 10, 25, 3, 26, 3, 26, 5, 26, 666, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 676, 10, 27, 12, 27, 14, 27, 679, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 685, 10, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 6, 28, 692, 10, 28, 13, 28, 14, 28, 693, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 5, 29, 703, 10, 29, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 709, 10, 31, 3, 32, 3, 32, 3, 32, 7, 32, 714, 10, 32, 12, 32, 14, 32, 717, 11, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 5, 33, 725, 10, 33, 3, 34, 3, 34, 5, 34, 729, 10, 34, 3, 35, 3, 35, 5, 35, 733, 10, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 7, 38, 742, 10, 38, 12, 38, 14, 38, 745, 11, 38, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 751, 10, 39, 3, 39, 2, 2, 4, 34, 40, 40, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 2, 9, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 2, 849, 2, 79, 3, 2, 2, 2, 4, 88, 3, 2, 2, 2, 6, 105, 3, 2, 2, 2, 8, 130, 3, 2, 2, 2, 10, 132, 3, 2, 2, 2, 12, 200, 3, 2, 2, 2, 14, 202, 3, 2, 2, 2, 16, 209, 3, 2, 2, 2, 18, 229, 3, 2, 2, 2, 20, 249, 3, 2, 2, 2, 22, 262, 3, 2, 2, 2, 24, 310, 3, 2, 2, 2, 26, 312, 3, 2, 2, 2, 28, 314, 3, 2, 2, 2, 30, 316, 3, 2, 2, 2, 32, 318, 3, 2, 2, 2, 34, 376, 3, 2, 2, 2, 36, 412, 3, 2, 2, 2, 38, 414, 3, 2, 2, 2, 40, 566, 3, 2, 2, 2, 42, 620, 3, 2, 2, 2, 44, 638, 3, 2, 2, 2, 46, 643, 3, 2, 2, 2, 48, 661, 3, 2, 2, 2, 50, 665, 3, 2, 2, 2, 52, 684, 3, 2, 2, 2, 54, 686, 3, 2, 2, 2, 56, 702, 3, 2, 2, 2, 58, 704, 3, 2, 2, 2, 60, 708, 3, 2, 2, 2, 62, 710, 3, 2, 2, 2, 64, 724, 3, 2, 2, 2, 66, 728, 3, 2, 2, 2, 68, 732, 3, 2, 2, 2, 70, 734, 3, 2, 2, 2, 72, 736, 3, 2, 2, 2, 74, 738, 3, 2, 2, 2, 76, 750, 3, 2, 2, 2, 78, 80, 5, 4, 3, 2, 79, 78, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 79, 3, 2, 2, 2, 81, 82, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 84, 7, 2, 2, 3, 84, 3, 3, 2, 2, 2, 85, 87, 7, 68, 2, 2, 86, 85, 3, 2, 2, 2, 87, 90, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 91, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 91, 92, 7, 3, 2, 2, 92, 93, 5, 74, 38, 2, 93, 97, 7, 4, 2, 2, 94, 96, 5, 6, 4, 2, 95, 94, 3, 2, 2, 2, 96, 99, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 100, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 100, 101, 7, 5, 2, 2, 101, 5, 3, 2, 2, 2, 102, 104, 7, 68, 2, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 5, 8, 5, 2, 109, 7, 3, 2, 2, 2, 110, 111, 7, 6, 2, 2, 111, 112, 5, 74, 38, 2, 112, 113, 7, 7, 2, 2, 113, 114, 5, 34, 18, 2, 114, 131, 3, 2, 2, 2, 115, 116, 7, 8, 2, 2, 116, 117, 5, 74, 38, 2, 117, 118, 7, 7, 2, 2, 118, 119, 5, 34, 18, 2, 119, 131, 3, 2, 2, 2, 120, 121, 7, 9, 2, 2, 121, 122, 5, 56, 29, 2, 122, 123, 7, 64, 2, 2, 123, 124, 5, 40, 21, 2, 124, 131, 3, 2, 2, 2, 125, 131, 5, 24, 13, 2, 126, 131, 5, 10, 6, 2, 127, 131, 5, 12, 7, 2, 128, 131, 5, 20, 11, 2, 129, 131, 5, 22, 12, 2, 130, 110, 3, 2, 2, 2, 130, 115, 3, 2, 2, 2, 130, 120, 3, 2, 2, 2, 130, 125, 3, 2, 2, 2, 130, 126, 3, 2, 2, 2, 130, 127, 3, 2, 2, 2, 130, 128, 3, 2, 2, 2, 130, 129, 3, 2, 2, 2, 131, 9, 3, 2, 2, 2, 132, 133, 5, 18, 10, 2, 133, 170, 5, 66, 34, 2, 134, 143, 7, 65, 2, 2, 135, 140, 5, 58, 30, 2, 136, 137, 7, 10, 2, 2, 137, 139, 5, 58, 30, 2, 138, 136, 3, 2, 2, 2, 139, 142, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 143, 135, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 148, 7, 66, 2, 2, 146, 147, 7, 7, 2, 2, 147, 149, 5, 34, 18, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 171, 3, 2, 2, 2, 150, 151, 7, 7, 2, 2, 151, 171, 5, 34, 18, 2, 152, 153, 7, 65, 2, 2, 153, 154, 5, 58, 30, 2, 154, 155, 7, 7, 2, 2, 155, 163, 5, 34, 18, 2, 156, 157, 7, 10, 2, 2, 157, 158, 5, 58, 30, 2, 158, 159, 7, 7, 2, 2, 159, 160, 5, 34, 18, 2, 160, 162, 3, 2, 2, 2, 161, 156, 3, 2, 2, 2, 162, 165, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 166, 3, 2, 2, 2, 165, 163, 3, 2, 2, 2, 166, 167, 7, 66, 2, 2, 167, 168, 7, 7, 2, 2, 168, 169, 5, 34, 18, 2, 169, 171, 3, 2, 2, 2, 170, 134, 3, 2, 2, 2, 170, 150, 3, 2, 2, 2, 170, 152, 3, 2, 2, 2, 170, 171, 3, 2, 2, 2, 171, 174, 3, 2, 2, 2, 172, 173, 7, 64, 2, 2, 173, 175, 5, 40, 21, 2, 174, 172, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 177, 3, 2, 2, 2, 176, 178, 7, 11, 2, 2, 177, 176, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 11, 3, 2, 2, 2, 179, 180, 7, 12, 2, 2, 180, 201, 5, 74, 38, 2, 181, 182, 7, 12, 2, 2, 182, 183, 5, 74, 38, 2, 183, 184, 7, 64, 2, 2, 184, 185, 5, 34, 18, 2, 185, 201, 3, 2, 2, 2, 186, 187, 7, 12, 2, 2, 187, 188, 5, 74, 38, 2, 188, 190, 7, 64, 2, 2, 189, 191, 7, 13, 2, 2, 190, 189, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 197, 5, 14, 8, 2, 193, 194, 7, 13, 2, 2, 194, 196, 5, 14, 8, 2, 195, 193, 3, 2, 2, 2, 196, 199, 3, 2, 2, 2, 197, 195, 3, 2, 2, 2, 197, 198, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 200, 179, 3, 2, 2, 2, 200, 181, 3, 2, 2, 2, 200, 186, 3, 2, 2, 2, 201, 13, 3, 2, 2, 2, 202, 207, 5, 76, 39, 2, 203, 204, 7, 65, 2, 2, 204, 205, 5, 34, 18, 2, 205, 206, 7, 66, 2, 2, 206, 208, 3, 2, 2, 2, 207, 203, 3, 2, 2, 2, 207, 208, 3, 2, 2, 2, 208, 15, 3, 2, 2, 2, 209, 210, 7, 14, 2, 2, 210, 213, 5, 74, 38, 2, 211, 212, 7, 7, 2, 2, 212, 214, 5, 34, 18, 2, 213, 211, 3, 2, 2, 2, 213, 214, 3, 2, 2, 2, 214, 215, 3, 2, 2, 2, 215, 216, 7, 64, 2, 2, 216, 218, 5, 40, 21, 2, 217, 219, 7, 11, 2, 2, 218, 217, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 17, 3, 2, 2, 2, 220, 230, 7, 15, 2, 2, 221, 230, 7, 16, 2, 2, 222, 223, 7, 17, 2, 2, 223, 230, 7, 15, 2, 2, 224, 225, 7, 17, 2, 2, 225, 230, 7, 16, 2, 2, 226, 230, 7, 18, 2, 2, 227, 230, 7, 19, 2, 2, 228, 230, 7, 20, 2, 2, 229, 220, 3, 2, 2, 2, 229, 221, 3, 2, 2, 2, 229, 222, 3, 2, 2, 2, 229, 224, 3, 2, 2, 2, 229, 226, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 229, 228, 3, 2, 2, 2, 230, 19, 3, 2, 2, 2, 231, 232, 7, 21, 2, 2, 232, 233, 5, 28, 15, 2, 233, 234, 7, 22, 2, 2, 234, 237, 5, 60, 31, 2, 235, 236, 7, 23, 2, 2, 236, 238, 5, 32, 17, 2, 237, 235, 3, 2, 2, 2, 237, 238, 3, 2, 2, 2, 238, 250, 3, 2, 2, 2, 239, 240, 7, 21, 2, 2, 240, 243, 5, 28, 15, 2, 241, 242, 7, 24, 2, 2, 242, 244, 5, 28, 15, 2, 243, 241, 3, 2, 2, 2, 243, 244, 3, 2, 2, 2, 244, 247, 3, 2, 2, 2, 245, 246, 7, 23, 2, 2, 246, 248, 5, 32, 17, 2, 247, 245, 3, 2, 2, 2, 247, 248, 3, 2, 2, 2, 248, 250, 3, 2, 2, 2, 249, 231, 3, 2, 2, 2, 249, 239, 3, 2, 2, 2, 250, 21, 3, 2, 2, 2, 251, 252, 7, 25, 2, 2, 252, 253, 5, 28, 15, 2, 253, 254, 7, 22, 2, 2, 254, 255, 5, 60, 31, 2, 255, 263, 3, 2, 2, 2, 256, 257, 7, 25, 2, 2, 257, 260, 5, 28, 15, 2, 258, 259, 7, 24, 2, 2, 259, 261, 5, 28, 15, 2, 260, 258, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 263, 3, 2, 2, 2, 262, 251, 3, 2, 2, 2, 262, 256, 3, 2, 2, 2, 263, 23, 3, 2, 2, 2, 264, 265, 7, 21, 2, 2, 265, 266, 5, 26, 14, 2, 266, 267, 7, 65, 2, 2, 267, 268, 5, 28, 15, 2, 268, 269, 7, 64, 2, 2, 269, 277, 5, 40, 21, 2, 270, 271, 7, 10, 2, 2, 271, 272, 5, 28, 15, 2, 272, 273, 7, 64, 2, 2, 273, 274, 5, 40, 21, 2, 274, 276, 3, 2, 2, 2, 275, 270, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 281, 7, 66, 2, 2, 281, 282, 7, 22, 2, 2, 282, 285, 7, 55, 2, 2, 283, 284, 7, 23, 2, 2, 284, 286, 5, 32, 17, 2, 285, 283, 3, 2, 2, 2, 285, 286, 3, 2, 2, 2, 286, 311, 3, 2, 2, 2, 287, 288, 7, 21, 2, 2, 288, 289, 5, 26, 14, 2, 289, 290, 7, 65, 2, 2, 290, 291, 5, 28, 15, 2, 291, 292, 7, 64, 2, 2, 292, 300, 5, 40, 21, 2, 293, 294, 7, 10, 2, 2, 294, 295, 5, 28, 15, 2, 295, 296, 7, 64, 2, 2, 296, 297, 5, 40, 21, 2, 297, 299, 3, 2, 2, 2, 298, 293, 3, 2, 2, 2, 299, 302, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 304, 7, 66, 2, 2, 304, 305, 7, 24, 2, 2, 305, 308, 5, 30, 16, 2, 306, 307, 7, 23, 2, 2, 307, 309, 5, 32, 17, 2, 308, 306, 3, 2, 2, 2, 308, 309, 3, 2, 2, 2, 309, 311, 3, 2, 2, 2, 310, 264, 3, 2, 2, 2, 310, 287, 3, 2, 2, 2, 311, 25, 3, 2, 2, 2, 312, 313, 5, 74, 38, 2, 313, 27, 3, 2, 2, 2, 314, 315, 5, 74, 38, 2, 315, 29, 3, 2, 2, 2, 316, 317, 5, 74, 38, 2, 317, 31, 3, 2, 2, 2, 318, 319, 7, 42, 2, 2, 319, 33, 3, 2, 2, 2, 320, 321, 8, 18, 1, 2, 321, 330, 7, 65, 2, 2, 322, 327, 5, 34, 18, 2, 323, 324, 7, 10, 2, 2, 324, 326, 5, 34, 18, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 331, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 322, 3, 2, 2, 2, 330, 331, 3, 2, 2, 2, 331, 333, 3, 2, 2, 2, 332, 334, 7, 10, 2, 2, 333, 332, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 335, 3, 2, 2, 2, 335, 336, 7, 66, 2, 2, 336, 337, 7, 27, 2, 2, 337, 377, 5, 34, 18, 12, 338, 339, 7, 49, 2, 2, 339, 340, 7, 28, 2, 2, 340, 341, 5, 34, 18, 2, 341, 342, 7, 29, 2, 2, 342, 377, 3, 2, 2, 2, 343, 344, 7, 50, 2, 2, 344, 345, 7, 28, 2, 2, 345, 346, 5, 34, 18, 2, 346, 347, 7, 29, 2, 2, 347, 377, 3, 2, 2, 2, 348, 349, 7, 65, 2, 2, 349, 350, 5, 34, 18, 2, 350, 351, 7, 10, 2, 2, 351, 356, 5, 34, 18, 2, 352, 353, 7, 10, 2, 2, 353, 355, 5, 34, 18, 2, 354, 352, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 360, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 361, 7, 10, 2, 2, 360, 359, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 362, 3, 2, 2, 2, 362, 363, 7, 66, 2, 2, 363, 377, 3, 2, 2, 2, 364, 365, 7, 4, 2, 2, 365, 366, 5, 36, 19, 2, 366, 367, 7, 5, 2, 2, 367, 377, 3, 2, 2, 2, 368, 377, 7, 30, 2, 2, 369, 377, 7, 31, 2, 2, 370, 377, 7, 32, 2, 2, 371, 377, 5, 74, 38, 2, 372, 373, 7, 65, 2, 2, 373, 374, 5, 34, 18, 2, 374, 375, 7, 66, 2, 2, 375, 377, 3, 2, 2, 2, 376, 320, 3, 2, 2, 2, 376, 338, 3, 2, 2, 2, 376, 343, 3, 2, 2, 2, 376, 348, 3, 2, 2, 2, 376, 364, 3, 2, 2, 2, 376, 368, 3, 2, 2, 2, 376, 369, 3, 2, 2, 2, 376, 370, 3, 2, 2, 2, 376, 371, 3, 2, 2, 2, 376, 372, 3, 2, 2, 2, 377, 386, 3, 2, 2, 2, 378, 379, 12, 14, 2, 2, 379, 380, 7, 26, 2, 2, 380, 385, 5, 34, 18, 14, 381, 382, 12, 13, 2, 2, 382, 383, 7, 27, 2, 2, 383, 385, 5, 34, 18, 13, 384, 378, 3, 2, 2, 2, 384, 381, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 35, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 5, 38, 20, 2, 390, 391, 7, 7, 2, 2, 391, 392, 5, 34, 18, 2, 392, 393, 7, 10, 2, 2, 393, 395, 3, 2, 2, 2, 394, 389, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 408, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 400, 5, 38, 20, 2, 400, 401, 7, 7, 2, 2, 401, 402, 5, 34, 18, 2, 402, 406, 3, 2, 2, 2, 403, 407, 7, 10, 2, 2, 404, 405, 7, 13, 2, 2, 405, 407, 7, 67, 2, 2, 406, 403, 3, 2, 2, 2, 406, 404, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 409, 3, 2, 2, 2, 408, 399, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 413, 3, 2, 2, 2, 410, 411, 7, 13, 2, 2, 411, 413, 7, 67, 2, 2, 412, 396, 3, 2, 2, 2, 412, 410, 3, 2, 2, 2, 413, 37, 3, 2, 2, 2, 414, 415, 5, 76, 39, 2, 415, 39, 3, 2, 2, 2, 416, 417, 8, 21, 1, 2, 417, 567, 5, 50, 26, 2, 418, 419, 5, 66, 34, 2, 419, 421, 7, 65, 2, 2, 420, 422, 5, 62, 32, 2, 421, 420, 3, 2, 2, 2, 421, 422, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 424, 7, 66, 2, 2, 424, 567, 3, 2, 2, 2, 425, 426, 7, 54, 2, 2, 426, 567, 5, 40, 21, 27, 427, 428, 5, 74, 38, 2, 428, 429, 7, 34, 2, 2, 429, 430, 7, 64, 2, 2, 430, 431, 5, 40, 21, 23, 431, 567, 3, 2, 2, 2, 432, 433, 7, 45, 2, 2, 433, 434, 7, 4, 2, 2, 434, 439, 5, 40, 21, 2, 435, 436, 7, 10, 2, 2, 436, 438, 5, 40, 21, 2, 437, 435, 3, 2, 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 443, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 444, 7, 10, 2, 2, 443, 442, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 446, 7, 5, 2, 2, 446, 567, 3, 2, 2, 2, 447, 448, 7, 46, 2, 2, 448, 449, 7, 4, 2, 2, 449, 454, 5, 40, 21, 2, 450, 451, 7, 10, 2, 2, 451, 453, 5, 40, 21, 2, 452, 450, 3, 2, 2, 2, 453, 456, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 459, 7, 10, 2, 2, 458, 457, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 461, 7, 5, 2, 2, 461, 567, 3, 2, 2, 2, 462, 567, 5, 42, 22, 2, 463, 464, 7, 35, 2, 2, 464, 465, 7, 4, 2, 2, 465, 470, 5, 40, 21, 2, 466, 467, 7, 10, 2, 2, 467, 469, 5, 40, 21, 2, 468, 466, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 475, 7, 10, 2, 2, 474, 473, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 7, 5, 2, 2, 477, 567, 3, 2, 2, 2, 478, 479, 7, 36, 2, 2, 479, 480, 7, 4, 2, 2, 480, 485, 5, 40, 21, 2, 481, 482, 7, 10, 2, 2, 482, 484, 5, 40, 21, 2, 483, 481, 3, 2, 2, 2, 484, 487, 3, 2, 2, 2, 485, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 488, 490, 7, 10, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 7, 5, 2, 2, 492, 567, 3, 2, 2, 2, 493, 498, 5, 74, 38, 2, 494, 498, 7, 44, 2, 2, 495, 498, 7, 43, 2, 2, 496, 498, 7, 42, 2, 2, 497, 493, 3, 2, 2, 2, 497, 494, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 496, 3, 2, 2, 2, 498, 567, 3, 2, 2, 2, 499, 500, 7, 65, 2, 2, 500, 501, 5, 40, 21, 2, 501, 502, 7, 10, 2, 2, 502, 507, 5, 40, 21, 2, 503, 504, 7, 10, 2, 2, 504, 506, 5, 40, 21, 2, 505, 503, 3, 2, 2, 2, 506, 509, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 511, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 510, 512, 7, 10, 2, 2, 511, 510, 3, 2, 2, 2, 511, 512, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 514, 7, 66, 2, 2, 514, 567, 3, 2, 2, 2, 515, 516, 7, 4, 2, 2, 516, 521, 5, 64, 33, 2, 517, 518, 7, 10, 2, 2, 518, 520, 5, 64, 33, 2, 519, 517, 3, 2, 2, 2, 520, 523, 3, 2, 2, 2, 521, 519, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 525, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 524, 526, 7, 10, 2, 2, 525, 524, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 7, 5, 2, 2, 528, 567, 3, 2, 2, 2, 529, 538, 7, 28, 2, 2, 530, 535, 5, 40, 21, 2, 531, 532, 7, 10, 2, 2, 532, 534, 5, 40, 21, 2, 533, 531, 3, 2, 2, 2, 534, 537, 3, 2, 2, 2, 535, 533, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 538, 530, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 541, 3, 2, 2, 2, 540, 542, 7, 10, 2, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 567, 7, 29, 2, 2, 544, 545, 7, 37, 2, 2, 545, 546, 7, 65, 2, 2, 546, 547, 5, 40, 21, 2, 547, 548, 7, 66, 2, 2, 548, 549, 5, 40, 21, 2, 549, 550, 7, 38, 2, 2, 550, 551, 5, 40, 21, 7, 551, 567, 3, 2, 2, 2, 552, 553, 5, 10, 6, 2, 553, 554, 5, 40, 21, 6, 554, 567, 3, 2, 2, 2, 555, 556, 5, 16, 9, 2, 556, 557, 5, 40, 21, 5, 557, 567, 3, 2, 2, 2, 558, 559, 7, 65, 2, 2, 559, 560, 5, 40, 21, 2, 560, 561, 7, 66, 2, 2, 561, 567, 3, 2, 2, 2, 562, 563, 7, 4, 2, 2, 563, 564, 5, 40, 21, 2, 564, 565, 7, 5, 2, 2, 565, 567, 3, 2, 2, 2, 566, 416, 3, 2, 2, 2, 566, 418, 3, 2, 2, 2, 566, 425, 3, 2, 2, 2, 566, 427, 3, 2, 2, 2, 566, 432, 3, 2, 2, 2, 566, 447, 3, 2, 2, 2, 566, 462, 3, 2, 2, 2, 566, 463, 3, 2, 2, 2, 566, 478, 3, 2, 2, 2, 566, 497, 3, 2, 2, 2, 566, 499, 3, 2, 2, 2, 566, 515, 3, 2, 2, 2, 566, 529, 3, 2, 2, 2, 566, 544, 3, 2, 2, 2, 566, 552, 3, 2, 2, 2, 566, 555, 3, 2, 2, 2, 566, 558, 3, 2, 2, 2, 566, 562, 3, 2, 2, 2, 567, 617, 3, 2, 2, 2, 568, 569, 12, 28, 2, 2, 569, 570, 7, 33, 2, 2, 570, 616, 5, 40, 21, 28, 571, 572, 12, 26, 2, 2, 572, 573, 9, 2, 2, 2, 573, 616, 5, 40, 21, 27, 574, 575, 12, 25, 2, 2, 575, 576, 9, 3, 2, 2, 576, 616, 5, 40, 21, 26, 577, 578, 12, 24, 2, 2, 578, 579, 9, 4, 2, 2, 579, 616, 5, 40, 21, 25, 580, 581, 12, 22, 2, 2, 581, 582, 7, 64, 2, 2, 582, 583, 5, 40, 21, 23, 583, 584, 8, 21, 1, 2, 584, 616, 3, 2, 2, 2, 585, 586, 12, 20, 2, 2, 586, 587, 7, 45, 2, 2, 587, 616, 5, 40, 21, 21, 588, 589, 12, 18, 2, 2, 589, 590, 7, 46, 2, 2, 590, 616, 5, 40, 21, 19, 591, 592, 12, 17, 2, 2, 592, 593, 7, 47, 2, 2, 593, 616, 5, 40, 21, 18, 594, 595, 12, 16, 2, 2, 595, 596, 7, 48, 2, 2, 596, 616, 5, 40, 21, 17, 597, 598, 12, 10, 2, 2, 598, 599, 7, 26, 2, 2, 599, 616, 5, 40, 21, 11, 600, 601, 12, 32, 2, 2, 601, 602, 7, 22, 2, 2, 602, 608, 5, 68, 35, 2, 603, 605, 7, 65, 2, 2, 604, 606, 5, 62, 32, 2, 605, 604, 3, 2, 2, 2, 605, 606, 3, 2, 2, 2, 606, 607, 3, 2, 2, 2, 607, 609, 7, 66, 2, 2, 608, 603, 3, 2, 2, 2, 608, 609, 3, 2, 2, 2, 609, 616, 3, 2, 2, 2, 610, 611, 12, 29, 2, 2, 611, 612, 7, 28, 2, 2, 612, 613, 5, 40, 21, 2, 613, 614, 7, 29, 2, 2, 614, 616, 3, 2, 2, 2, 615, 568, 3, 2, 2, 2, 615, 571, 3, 2, 2, 2, 615, 574, 3, 2, 2, 2, 615, 577, 3, 2, 2, 2, 615, 580, 3, 2, 2, 2, 615, 585, 3, 2, 2, 2, 615, 588, 3, 2, 2, 2, 615, 591, 3, 2, 2, 2, 615, 594, 3, 2, 2, 2, 615, 597, 3, 2, 2, 2, 615, 600, 3, 2, 2, 2, 615, 610, 3, 2, 2, 2, 616, 619, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 41, 3, 2, 2, 2, 619, 617, 3, 2, 2, 2, 620, 621, 7, 52, 2, 2, 621, 622, 5, 40, 21, 2, 622, 624, 7, 4, 2, 2, 623, 625, 7, 13, 2, 2, 624, 623, 3, 2, 2, 2, 624, 625, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 631, 5, 44, 23, 2, 627, 628, 7, 13, 2, 2, 628, 630, 5, 44, 23, 2, 629, 627, 3, 2, 2, 2, 630, 633, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 634, 3, 2, 2, 2, 633, 631, 3, 2, 2, 2, 634, 635, 7, 5, 2, 2, 635, 43, 3, 2, 2, 2, 636, 639, 5, 46, 24, 2, 637, 639, 7, 39, 2, 2, 638, 636, 3, 2, 2, 2, 638, 637, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 641, 7, 27, 2, 2, 641, 642, 5, 40, 21, 2, 642, 45, 3, 2, 2, 2, 643, 650, 5, 76, 39, 2, 644, 647, 7, 65, 2, 2, 645, 648, 5, 76, 39, 2, 646, 648, 7, 39, 2, 2, 647, 645, 3, 2, 2, 2, 647, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 651, 7, 66, 2, 2, 650, 644, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 47, 3, 2, 2, 2, 652, 653, 5, 8, 5, 2, 653, 654, 7, 2, 2, 3, 654, 662, 3, 2, 2, 2, 655, 656, 5, 40, 21, 2, 656, 657, 7, 2, 2, 3, 657, 662, 3, 2, 2, 2, 658, 659, 7, 68, 2, 2, 659, 662, 7, 2, 2, 3, 660, 662, 7, 2, 2, 3, 661, 652, 3, 2, 2, 2, 661, 655, 3, 2, 2, 2, 661, 658, 3, 2, 2, 2, 661, 660, 3, 2, 2, 2, 662, 49, 3, 2, 2, 2, 663, 666, 5, 52, 27, 2, 664, 666, 5, 54, 28, 2, 665, 663, 3, 2, 2, 2, 665, 664, 3, 2, 2, 2, 666, 51, 3, 2, 2, 2, 667, 668, 5, 58, 30, 2, 668, 669, 7, 27, 2, 2, 669, 670, 5, 40, 21, 2, 670, 685, 3, 2, 2, 2, 671, 672, 7, 65, 2, 2, 672, 677, 5, 58, 30, 2, 673, 674, 7, 10, 2, 2, 674, 676, 5, 58, 30, 2, 675, 673, 3, 2, 2, 2, 676, 679, 3, 2, 2, 2, 677, 675, 3, 2, 2, 2, 677, 678, 3, 2, 2, 2, 678, 680, 3, 2, 2, 2, 679, 677, 3, 2, 2, 2, 680, 681, 7, 66, 2, 2, 681, 682, 7, 27, 2, 2, 682, 683, 5, 40, 21, 2, 683, 685, 3, 2, 2, 2, 684, 667, 3, 2, 2, 2, 684, 671, 3, 2, 2, 2, 685, 53, 3, 2, 2, 2, 686, 687, 7, 65, 2, 2, 687, 688, 7, 65, 2, 2, 688, 691, 5, 58, 30, 2, 689, 690, 7, 10, 2, 2, 690, 692, 5, 58, 30, 2, 691, 689, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 691, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 695, 3, 2, 2, 2, 695, 696, 7, 66, 2, 2, 696, 697, 7, 66, 2, 2, 697, 698, 7, 27, 2, 2, 698, 699, 5, 40, 21, 2, 699, 55, 3, 2, 2, 2, 700, 703, 7, 39, 2, 2, 701, 703, 5, 74, 38, 2, 702, 700, 3, 2, 2, 2, 702, 701, 3, 2, 2, 2, 703, 57, 3, 2, 2, 2, 704, 705, 5, 56, 29, 2, 705, 59, 3, 2, 2, 2, 706, 709, 7, 55, 2, 2, 707, 709, 5, 74, 38, 2, 708, 706, 3, 2, 2, 2, 708, 707, 3, 2, 2, 2, 709, 61, 3, 2, 2, 2, 710, 715, 5, 40, 21, 2, 711, 712, 7, 10, 2, 2, 712, 714, 5, 40, 21, 2, 713, 711, 3, 2, 2, 2, 714, 717, 3, 2, 2, 2, 715, 713, 3, 2, 2, 2, 715, 716, 3, 2, 2, 2, 716, 63, 3, 2, 2, 2, 717, 715, 3, 2, 2, 2, 718, 719, 5, 76, 39, 2, 719, 720, 7, 7, 2, 2, 720, 721, 5, 40, 21, 2, 721, 725, 3, 2, 2, 2, 722, 723, 7, 40, 2, 2, 723, 725, 5, 40, 21, 2, 724, 718, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 725, 65, 3, 2, 2, 2, 726, 729, 5, 74, 38, 2, 727, 729, 9, 5, 2, 2, 728, 726, 3, 2, 2, 2, 728, 727, 3, 2, 2, 2, 729, 67, 3, 2, 2, 2, 730, 733, 5, 74, 38, 2, 731, 733, 9, 6, 2, 2, 732, 730, 3, 2, 2, 2, 732, 731, 3, 2, 2, 2, 733, 69, 3, 2, 2, 2, 734, 735, 9, 7, 2, 2, 735, 71, 3, 2, 2, 2, 736, 737, 9, 8, 2, 2, 737, 73, 3, 2, 2, 2, 738, 743, 7, 67, 2, 2, 739, 740, 7, 41, 2, 2, 740, 742, 7, 67, 2, 2, 741, 739, 3, 2, 2, 2, 742, 745, 3, 2, 2, 2, 743, 741, 3, 2, 2, 2, 743, 744, 3, 2, 2, 2, 744, 75, 3, 2, 2, 2, 745, 743, 3, 2, 2, 2, 746, 751, 7, 67, 2, 2, 747, 748, 5, 74, 38, 2, 748, 749, 8, 39, 1, 2, 749, 751, 3, 2, 2, 2, 750, 746, 3, 2, 2, 2, 750, 747, 3, 2, 2, 2, 751, 77, 3, 2, 2, 2, 84, 81, 88, 97, 105, 130, 140, 143, 148, 163, 170, 174, 177, 190, 197, 200, 207, 213, 218, 229, 237, 243, 247, 249, 260, 262, 277, 285, 300, 308, 310, 327, 330, 333, 356, 360, 376, 384, 386, 396, 406, 408, 412, 421, 439, 443, 454, 458, 470, 474, 485, 489, 497, 507, 511, 521, 525, 535, 538, 541, 566, 605, 608, 615, 617, 624, 631, 638, 647, 650, 661, 665, 677, 684, 693, 702, 708, 715, 724, 728, 732, 743, 750] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 72, 790, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 6, 2, 88, 10, 2, 13, 2, 14, 2, 89, 3, 2, 3, 2, 3, 3, 7, 3, 95, 10, 3, 12, 3, 14, 3, 98, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 104, 10, 3, 12, 3, 14, 3, 107, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 112, 10, 4, 12, 4, 14, 4, 115, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 139, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 147, 10, 6, 12, 6, 14, 6, 150, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 157, 10, 6, 3, 6, 5, 6, 160, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 168, 10, 6, 12, 6, 14, 6, 171, 11, 6, 5, 6, 173, 10, 6, 3, 6, 5, 6, 176, 10, 6, 3, 6, 3, 6, 5, 6, 180, 10, 6, 3, 6, 3, 6, 5, 6, 184, 10, 6, 3, 6, 5, 6, 187, 10, 6, 5, 6, 189, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 203, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 210, 10, 8, 12, 8, 14, 8, 213, 11, 8, 3, 8, 5, 8, 216, 10, 8, 3, 9, 5, 9, 219, 10, 9, 3, 9, 3, 9, 3, 9, 7, 9, 224, 10, 9, 12, 9, 14, 9, 227, 11, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 234, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 254, 10, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 260, 10, 12, 3, 12, 3, 12, 5, 12, 264, 10, 12, 5, 12, 266, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 277, 10, 13, 5, 13, 279, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 292, 10, 14, 12, 14, 14, 14, 295, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 302, 10, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 315, 10, 14, 12, 14, 14, 14, 318, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 325, 10, 14, 5, 14, 327, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 342, 10, 19, 12, 19, 14, 19, 345, 11, 19, 5, 19, 347, 10, 19, 3, 19, 5, 19, 350, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 373, 10, 19, 12, 19, 14, 19, 376, 11, 19, 3, 19, 5, 19, 379, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 385, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 402, 10, 19, 12, 19, 14, 19, 405, 11, 19, 3, 19, 3, 19, 5, 19, 409, 10, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 417, 10, 19, 12, 19, 14, 19, 420, 11, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 433, 10, 21, 12, 21, 14, 21, 436, 11, 21, 3, 21, 3, 21, 3, 21, 5, 21, 441, 10, 21, 3, 21, 3, 21, 5, 21, 445, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 454, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 470, 10, 23, 12, 23, 14, 23, 473, 11, 23, 3, 23, 5, 23, 476, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 485, 10, 23, 12, 23, 14, 23, 488, 11, 23, 3, 23, 5, 23, 491, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 501, 10, 23, 12, 23, 14, 23, 504, 11, 23, 3, 23, 5, 23, 507, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 516, 10, 23, 12, 23, 14, 23, 519, 11, 23, 3, 23, 5, 23, 522, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 530, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 538, 10, 23, 12, 23, 14, 23, 541, 11, 23, 3, 23, 5, 23, 544, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 554, 10, 23, 12, 23, 14, 23, 557, 11, 23, 3, 23, 5, 23, 560, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 568, 10, 23, 12, 23, 14, 23, 571, 11, 23, 5, 23, 573, 10, 23, 3, 23, 5, 23, 576, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 598, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 637, 10, 23, 3, 23, 5, 23, 640, 10, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 647, 10, 23, 12, 23, 14, 23, 650, 11, 23, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 656, 10, 24, 3, 24, 3, 24, 3, 24, 7, 24, 661, 10, 24, 12, 24, 14, 24, 664, 11, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 670, 10, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 679, 10, 26, 3, 26, 5, 26, 682, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 693, 10, 27, 3, 28, 3, 28, 5, 28, 697, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 707, 10, 29, 12, 29, 14, 29, 710, 11, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 716, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 6, 30, 723, 10, 30, 13, 30, 14, 30, 724, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 5, 31, 734, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 744, 10, 34, 3, 35, 3, 35, 3, 35, 7, 35, 749, 10, 35, 12, 35, 14, 35, 752, 11, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 760, 10, 36, 3, 37, 3, 37, 5, 37, 764, 10, 37, 3, 38, 3, 38, 5, 38, 768, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 7, 41, 777, 10, 41, 12, 41, 14, 41, 780, 11, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 786, 10, 42, 3, 43, 3, 43, 3, 43, 2, 2, 4, 36, 44, 44, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 76, 2, 78, 2, 80, 2, 82, 2, 84, 2, 2, 10, 3, 2, 53, 55, 3, 2, 51, 52, 3, 2, 56, 61, 4, 2, 45, 49, 65, 66, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 51, 61, 3, 2, 42, 44, 3, 2, 67, 68, 2, 888, 2, 87, 3, 2, 2, 2, 4, 96, 3, 2, 2, 2, 6, 113, 3, 2, 2, 2, 8, 138, 3, 2, 2, 2, 10, 188, 3, 2, 2, 2, 12, 202, 3, 2, 2, 2, 14, 204, 3, 2, 2, 2, 16, 218, 3, 2, 2, 2, 18, 228, 3, 2, 2, 2, 20, 245, 3, 2, 2, 2, 22, 265, 3, 2, 2, 2, 24, 278, 3, 2, 2, 2, 26, 326, 3, 2, 2, 2, 28, 328, 3, 2, 2, 2, 30, 330, 3, 2, 2, 2, 32, 332, 3, 2, 2, 2, 34, 334, 3, 2, 2, 2, 36, 408, 3, 2, 2, 2, 38, 421, 3, 2, 2, 2, 40, 444, 3, 2, 2, 2, 42, 446, 3, 2, 2, 2, 44, 597, 3, 2, 2, 2, 46, 651, 3, 2, 2, 2, 48, 669, 3, 2, 2, 2, 50, 674, 3, 2, 2, 2, 52, 692, 3, 2, 2, 2, 54, 696, 3, 2, 2, 2, 56, 715, 3, 2, 2, 2, 58, 717, 3, 2, 2, 2, 60, 733, 3, 2, 2, 2, 62, 735, 3, 2, 2, 2, 64, 737, 3, 2, 2, 2, 66, 743, 3, 2, 2, 2, 68, 745, 3, 2, 2, 2, 70, 759, 3, 2, 2, 2, 72, 763, 3, 2, 2, 2, 74, 767, 3, 2, 2, 2, 76, 769, 3, 2, 2, 2, 78, 771, 3, 2, 2, 2, 80, 773, 3, 2, 2, 2, 82, 785, 3, 2, 2, 2, 84, 787, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 92, 7, 2, 2, 3, 92, 3, 3, 2, 2, 2, 93, 95, 7, 69, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 99, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 3, 2, 2, 100, 101, 5, 80, 41, 2, 101, 105, 7, 4, 2, 2, 102, 104, 5, 6, 4, 2, 103, 102, 3, 2, 2, 2, 104, 107, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 105, 106, 3, 2, 2, 2, 106, 108, 3, 2, 2, 2, 107, 105, 3, 2, 2, 2, 108, 109, 7, 5, 2, 2, 109, 5, 3, 2, 2, 2, 110, 112, 7, 69, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 5, 8, 5, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 6, 2, 2, 119, 120, 5, 80, 41, 2, 120, 121, 7, 7, 2, 2, 121, 122, 5, 36, 19, 2, 122, 139, 3, 2, 2, 2, 123, 124, 7, 8, 2, 2, 124, 125, 5, 80, 41, 2, 125, 126, 7, 7, 2, 2, 126, 127, 5, 36, 19, 2, 127, 139, 3, 2, 2, 2, 128, 129, 7, 9, 2, 2, 129, 130, 5, 60, 31, 2, 130, 131, 7, 62, 2, 2, 131, 132, 5, 44, 23, 2, 132, 139, 3, 2, 2, 2, 133, 139, 5, 26, 14, 2, 134, 139, 5, 10, 6, 2, 135, 139, 5, 12, 7, 2, 136, 139, 5, 22, 12, 2, 137, 139, 5, 24, 13, 2, 138, 118, 3, 2, 2, 2, 138, 123, 3, 2, 2, 2, 138, 128, 3, 2, 2, 2, 138, 133, 3, 2, 2, 2, 138, 134, 3, 2, 2, 2, 138, 135, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 137, 3, 2, 2, 2, 139, 9, 3, 2, 2, 2, 140, 141, 5, 20, 11, 2, 141, 142, 5, 72, 37, 2, 142, 143, 7, 63, 2, 2, 143, 148, 5, 64, 33, 2, 144, 145, 7, 10, 2, 2, 145, 147, 5, 64, 33, 2, 146, 144, 3, 2, 2, 2, 147, 150, 3, 2, 2, 2, 148, 146, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 151, 3, 2, 2, 2, 150, 148, 3, 2, 2, 2, 151, 152, 7, 64, 2, 2, 152, 153, 7, 7, 2, 2, 153, 156, 5, 36, 19, 2, 154, 155, 7, 62, 2, 2, 155, 157, 5, 44, 23, 2, 156, 154, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 159, 3, 2, 2, 2, 158, 160, 7, 11, 2, 2, 159, 158, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 189, 3, 2, 2, 2, 161, 162, 5, 20, 11, 2, 162, 175, 5, 72, 37, 2, 163, 172, 7, 63, 2, 2, 164, 169, 5, 62, 32, 2, 165, 166, 7, 10, 2, 2, 166, 168, 5, 62, 32, 2, 167, 165, 3, 2, 2, 2, 168, 171, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 172, 164, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 7, 64, 2, 2, 175, 163, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 178, 7, 7, 2, 2, 178, 180, 5, 36, 19, 2, 179, 177, 3, 2, 2, 2, 179, 180, 3, 2, 2, 2, 180, 183, 3, 2, 2, 2, 181, 182, 7, 62, 2, 2, 182, 184, 5, 44, 23, 2, 183, 181, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 186, 3, 2, 2, 2, 185, 187, 7, 11, 2, 2, 186, 185, 3, 2, 2, 2, 186, 187, 3, 2, 2, 2, 187, 189, 3, 2, 2, 2, 188, 140, 3, 2, 2, 2, 188, 161, 3, 2, 2, 2, 189, 11, 3, 2, 2, 2, 190, 191, 7, 12, 2, 2, 191, 203, 5, 80, 41, 2, 192, 193, 7, 12, 2, 2, 193, 194, 5, 14, 8, 2, 194, 195, 7, 62, 2, 2, 195, 196, 5, 36, 19, 2, 196, 203, 3, 2, 2, 2, 197, 198, 7, 12, 2, 2, 198, 199, 5, 14, 8, 2, 199, 200, 7, 62, 2, 2, 200, 201, 5, 16, 9, 2, 201, 203, 3, 2, 2, 2, 202, 190, 3, 2, 2, 2, 202, 192, 3, 2, 2, 2, 202, 197, 3, 2, 2, 2, 203, 13, 3, 2, 2, 2, 204, 215, 5, 80, 41, 2, 205, 206, 7, 13, 2, 2, 206, 211, 7, 67, 2, 2, 207, 208, 7, 10, 2, 2, 208, 210, 7, 67, 2, 2, 209, 207, 3, 2, 2, 2, 210, 213, 3, 2, 2, 2, 211, 209, 3, 2, 2, 2, 211, 212, 3, 2, 2, 2, 212, 214, 3, 2, 2, 2, 213, 211, 3, 2, 2, 2, 214, 216, 7, 14, 2, 2, 215, 205, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 15, 3, 2, 2, 2, 217, 219, 7, 15, 2, 2, 218, 217, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 225, 5, 18, 10, 2, 221, 222, 7, 15, 2, 2, 222, 224, 5, 18, 10, 2, 223, 221, 3, 2, 2, 2, 224, 227, 3, 2, 2, 2, 225, 223, 3, 2, 2, 2, 225, 226, 3, 2, 2, 2, 226, 17, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 228, 233, 5, 82, 42, 2, 229, 230, 7, 63, 2, 2, 230, 231, 5, 36, 19, 2, 231, 232, 7, 64, 2, 2, 232, 234, 3, 2, 2, 2, 233, 229, 3, 2, 2, 2, 233, 234, 3, 2, 2, 2, 234, 19, 3, 2, 2, 2, 235, 246, 7, 16, 2, 2, 236, 246, 7, 17, 2, 2, 237, 238, 7, 18, 2, 2, 238, 246, 7, 16, 2, 2, 239, 240, 7, 18, 2, 2, 240, 246, 7, 17, 2, 2, 241, 246, 7, 19, 2, 2, 242, 246, 7, 20, 2, 2, 243, 246, 7, 21, 2, 2, 244, 246, 7, 22, 2, 2, 245, 235, 3, 2, 2, 2, 245, 236, 3, 2, 2, 2, 245, 237, 3, 2, 2, 2, 245, 239, 3, 2, 2, 2, 245, 241, 3, 2, 2, 2, 245, 242, 3, 2, 2, 2, 245, 243, 3, 2, 2, 2, 245, 244, 3, 2, 2, 2, 246, 21, 3, 2, 2, 2, 247, 248, 7, 23, 2, 2, 248, 249, 5, 30, 16, 2, 249, 250, 7, 24, 2, 2, 250, 253, 5, 66, 34, 2, 251, 252, 7, 25, 2, 2, 252, 254, 5, 34, 18, 2, 253, 251, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 266, 3, 2, 2, 2, 255, 256, 7, 23, 2, 2, 256, 259, 5, 30, 16, 2, 257, 258, 7, 26, 2, 2, 258, 260, 5, 30, 16, 2, 259, 257, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 262, 7, 25, 2, 2, 262, 264, 5, 34, 18, 2, 263, 261, 3, 2, 2, 2, 263, 264, 3, 2, 2, 2, 264, 266, 3, 2, 2, 2, 265, 247, 3, 2, 2, 2, 265, 255, 3, 2, 2, 2, 266, 23, 3, 2, 2, 2, 267, 268, 7, 27, 2, 2, 268, 269, 5, 30, 16, 2, 269, 270, 7, 24, 2, 2, 270, 271, 5, 66, 34, 2, 271, 279, 3, 2, 2, 2, 272, 273, 7, 27, 2, 2, 273, 276, 5, 30, 16, 2, 274, 275, 7, 26, 2, 2, 275, 277, 5, 30, 16, 2, 276, 274, 3, 2, 2, 2, 276, 277, 3, 2, 2, 2, 277, 279, 3, 2, 2, 2, 278, 267, 3, 2, 2, 2, 278, 272, 3, 2, 2, 2, 279, 25, 3, 2, 2, 2, 280, 281, 7, 23, 2, 2, 281, 282, 5, 28, 15, 2, 282, 283, 7, 63, 2, 2, 283, 284, 5, 30, 16, 2, 284, 285, 7, 62, 2, 2, 285, 293, 5, 44, 23, 2, 286, 287, 7, 10, 2, 2, 287, 288, 5, 30, 16, 2, 288, 289, 7, 62, 2, 2, 289, 290, 5, 44, 23, 2, 290, 292, 3, 2, 2, 2, 291, 286, 3, 2, 2, 2, 292, 295, 3, 2, 2, 2, 293, 291, 3, 2, 2, 2, 293, 294, 3, 2, 2, 2, 294, 296, 3, 2, 2, 2, 295, 293, 3, 2, 2, 2, 296, 297, 7, 64, 2, 2, 297, 298, 7, 24, 2, 2, 298, 301, 7, 53, 2, 2, 299, 300, 7, 25, 2, 2, 300, 302, 5, 34, 18, 2, 301, 299, 3, 2, 2, 2, 301, 302, 3, 2, 2, 2, 302, 327, 3, 2, 2, 2, 303, 304, 7, 23, 2, 2, 304, 305, 5, 28, 15, 2, 305, 306, 7, 63, 2, 2, 306, 307, 5, 30, 16, 2, 307, 308, 7, 62, 2, 2, 308, 316, 5, 44, 23, 2, 309, 310, 7, 10, 2, 2, 310, 311, 5, 30, 16, 2, 311, 312, 7, 62, 2, 2, 312, 313, 5, 44, 23, 2, 313, 315, 3, 2, 2, 2, 314, 309, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 319, 3, 2, 2, 2, 318, 316, 3, 2, 2, 2, 319, 320, 7, 64, 2, 2, 320, 321, 7, 26, 2, 2, 321, 324, 5, 32, 17, 2, 322, 323, 7, 25, 2, 2, 323, 325, 5, 34, 18, 2, 324, 322, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 327, 3, 2, 2, 2, 326, 280, 3, 2, 2, 2, 326, 303, 3, 2, 2, 2, 327, 27, 3, 2, 2, 2, 328, 329, 5, 80, 41, 2, 329, 29, 3, 2, 2, 2, 330, 331, 5, 80, 41, 2, 331, 31, 3, 2, 2, 2, 332, 333, 5, 80, 41, 2, 333, 33, 3, 2, 2, 2, 334, 335, 7, 42, 2, 2, 335, 35, 3, 2, 2, 2, 336, 337, 8, 19, 1, 2, 337, 346, 7, 63, 2, 2, 338, 343, 5, 36, 19, 2, 339, 340, 7, 10, 2, 2, 340, 342, 5, 36, 19, 2, 341, 339, 3, 2, 2, 2, 342, 345, 3, 2, 2, 2, 343, 341, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 347, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 346, 338, 3, 2, 2, 2, 346, 347, 3, 2, 2, 2, 347, 349, 3, 2, 2, 2, 348, 350, 7, 10, 2, 2, 349, 348, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 7, 64, 2, 2, 352, 353, 7, 29, 2, 2, 353, 409, 5, 36, 19, 15, 354, 355, 7, 65, 2, 2, 355, 356, 7, 13, 2, 2, 356, 357, 5, 36, 19, 2, 357, 358, 7, 14, 2, 2, 358, 409, 3, 2, 2, 2, 359, 360, 7, 66, 2, 2, 360, 361, 7, 13, 2, 2, 361, 362, 5, 36, 19, 2, 362, 363, 7, 14, 2, 2, 363, 409, 3, 2, 2, 2, 364, 365, 7, 63, 2, 2, 365, 409, 7, 64, 2, 2, 366, 367, 7, 63, 2, 2, 367, 368, 5, 36, 19, 2, 368, 369, 7, 10, 2, 2, 369, 374, 5, 36, 19, 2, 370, 371, 7, 10, 2, 2, 371, 373, 5, 36, 19, 2, 372, 370, 3, 2, 2, 2, 373, 376, 3, 2, 2, 2, 374, 372, 3, 2, 2, 2, 374, 375, 3, 2, 2, 2, 375, 378, 3, 2, 2, 2, 376, 374, 3, 2, 2, 2, 377, 379, 7, 10, 2, 2, 378, 377, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 381, 7, 64, 2, 2, 381, 409, 3, 2, 2, 2, 382, 384, 7, 4, 2, 2, 383, 385, 5, 40, 21, 2, 384, 383, 3, 2, 2, 2, 384, 385, 3, 2, 2, 2, 385, 386, 3, 2, 2, 2, 386, 409, 7, 5, 2, 2, 387, 409, 7, 30, 2, 2, 388, 409, 7, 31, 2, 2, 389, 409, 7, 32, 2, 2, 390, 409, 5, 38, 20, 2, 391, 409, 5, 80, 41, 2, 392, 393, 7, 63, 2, 2, 393, 394, 5, 36, 19, 2, 394, 395, 7, 64, 2, 2, 395, 409, 3, 2, 2, 2, 396, 397, 5, 80, 41, 2, 397, 398, 7, 13, 2, 2, 398, 403, 5, 36, 19, 2, 399, 400, 7, 10, 2, 2, 400, 402, 5, 36, 19, 2, 401, 399, 3, 2, 2, 2, 402, 405, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 406, 3, 2, 2, 2, 405, 403, 3, 2, 2, 2, 406, 407, 7, 14, 2, 2, 407, 409, 3, 2, 2, 2, 408, 336, 3, 2, 2, 2, 408, 354, 3, 2, 2, 2, 408, 359, 3, 2, 2, 2, 408, 364, 3, 2, 2, 2, 408, 366, 3, 2, 2, 2, 408, 382, 3, 2, 2, 2, 408, 387, 3, 2, 2, 2, 408, 388, 3, 2, 2, 2, 408, 389, 3, 2, 2, 2, 408, 390, 3, 2, 2, 2, 408, 391, 3, 2, 2, 2, 408, 392, 3, 2, 2, 2, 408, 396, 3, 2, 2, 2, 409, 418, 3, 2, 2, 2, 410, 411, 12, 17, 2, 2, 411, 412, 7, 28, 2, 2, 412, 417, 5, 36, 19, 17, 413, 414, 12, 16, 2, 2, 414, 415, 7, 29, 2, 2, 415, 417, 5, 36, 19, 16, 416, 410, 3, 2, 2, 2, 416, 413, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 37, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 422, 7, 67, 2, 2, 422, 39, 3, 2, 2, 2, 423, 424, 5, 42, 22, 2, 424, 425, 7, 7, 2, 2, 425, 426, 5, 36, 19, 2, 426, 434, 3, 2, 2, 2, 427, 428, 7, 10, 2, 2, 428, 429, 5, 42, 22, 2, 429, 430, 7, 7, 2, 2, 430, 431, 5, 36, 19, 2, 431, 433, 3, 2, 2, 2, 432, 427, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 440, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 441, 7, 10, 2, 2, 438, 439, 7, 15, 2, 2, 439, 441, 5, 84, 43, 2, 440, 437, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 445, 3, 2, 2, 2, 442, 443, 7, 15, 2, 2, 443, 445, 5, 84, 43, 2, 444, 423, 3, 2, 2, 2, 444, 442, 3, 2, 2, 2, 445, 41, 3, 2, 2, 2, 446, 447, 5, 82, 42, 2, 447, 43, 3, 2, 2, 2, 448, 449, 8, 23, 1, 2, 449, 598, 5, 54, 28, 2, 450, 451, 5, 72, 37, 2, 451, 453, 7, 63, 2, 2, 452, 454, 5, 68, 35, 2, 453, 452, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 456, 7, 64, 2, 2, 456, 598, 3, 2, 2, 2, 457, 458, 7, 52, 2, 2, 458, 598, 5, 44, 23, 27, 459, 460, 5, 80, 41, 2, 460, 461, 7, 34, 2, 2, 461, 462, 7, 62, 2, 2, 462, 463, 5, 44, 23, 23, 463, 598, 3, 2, 2, 2, 464, 465, 7, 45, 2, 2, 465, 466, 7, 4, 2, 2, 466, 471, 5, 44, 23, 2, 467, 468, 7, 10, 2, 2, 468, 470, 5, 44, 23, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 10, 2, 2, 475, 474, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 5, 2, 2, 478, 598, 3, 2, 2, 2, 479, 480, 7, 46, 2, 2, 480, 481, 7, 4, 2, 2, 481, 486, 5, 44, 23, 2, 482, 483, 7, 10, 2, 2, 483, 485, 5, 44, 23, 2, 484, 482, 3, 2, 2, 2, 485, 488, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 490, 3, 2, 2, 2, 488, 486, 3, 2, 2, 2, 489, 491, 7, 10, 2, 2, 490, 489, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 492, 3, 2, 2, 2, 492, 493, 7, 5, 2, 2, 493, 598, 3, 2, 2, 2, 494, 598, 5, 46, 24, 2, 495, 496, 7, 35, 2, 2, 496, 497, 7, 4, 2, 2, 497, 502, 5, 44, 23, 2, 498, 499, 7, 10, 2, 2, 499, 501, 5, 44, 23, 2, 500, 498, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 506, 3, 2, 2, 2, 504, 502, 3, 2, 2, 2, 505, 507, 7, 10, 2, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 5, 2, 2, 509, 598, 3, 2, 2, 2, 510, 511, 7, 36, 2, 2, 511, 512, 7, 4, 2, 2, 512, 517, 5, 44, 23, 2, 513, 514, 7, 10, 2, 2, 514, 516, 5, 44, 23, 2, 515, 513, 3, 2, 2, 2, 516, 519, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 521, 3, 2, 2, 2, 519, 517, 3, 2, 2, 2, 520, 522, 7, 10, 2, 2, 521, 520, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 7, 5, 2, 2, 524, 598, 3, 2, 2, 2, 525, 530, 5, 80, 41, 2, 526, 530, 7, 44, 2, 2, 527, 530, 7, 43, 2, 2, 528, 530, 7, 42, 2, 2, 529, 525, 3, 2, 2, 2, 529, 526, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 528, 3, 2, 2, 2, 530, 598, 3, 2, 2, 2, 531, 532, 7, 63, 2, 2, 532, 533, 5, 44, 23, 2, 533, 534, 7, 10, 2, 2, 534, 539, 5, 44, 23, 2, 535, 536, 7, 10, 2, 2, 536, 538, 5, 44, 23, 2, 537, 535, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 543, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 544, 7, 10, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 7, 64, 2, 2, 546, 598, 3, 2, 2, 2, 547, 548, 7, 63, 2, 2, 548, 598, 7, 64, 2, 2, 549, 550, 7, 4, 2, 2, 550, 555, 5, 70, 36, 2, 551, 552, 7, 10, 2, 2, 552, 554, 5, 70, 36, 2, 553, 551, 3, 2, 2, 2, 554, 557, 3, 2, 2, 2, 555, 553, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 559, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 558, 560, 7, 10, 2, 2, 559, 558, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 3, 2, 2, 2, 561, 562, 7, 5, 2, 2, 562, 598, 3, 2, 2, 2, 563, 572, 7, 13, 2, 2, 564, 569, 5, 44, 23, 2, 565, 566, 7, 10, 2, 2, 566, 568, 5, 44, 23, 2, 567, 565, 3, 2, 2, 2, 568, 571, 3, 2, 2, 2, 569, 567, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 573, 3, 2, 2, 2, 571, 569, 3, 2, 2, 2, 572, 564, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 575, 3, 2, 2, 2, 574, 576, 7, 10, 2, 2, 575, 574, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 577, 3, 2, 2, 2, 577, 598, 7, 14, 2, 2, 578, 579, 7, 37, 2, 2, 579, 580, 7, 63, 2, 2, 580, 581, 5, 44, 23, 2, 581, 582, 7, 64, 2, 2, 582, 583, 5, 44, 23, 2, 583, 584, 7, 38, 2, 2, 584, 585, 5, 44, 23, 6, 585, 598, 3, 2, 2, 2, 586, 587, 5, 10, 6, 2, 587, 588, 5, 44, 23, 5, 588, 598, 3, 2, 2, 2, 589, 590, 7, 63, 2, 2, 590, 591, 5, 44, 23, 2, 591, 592, 7, 64, 2, 2, 592, 598, 3, 2, 2, 2, 593, 594, 7, 4, 2, 2, 594, 595, 5, 44, 23, 2, 595, 596, 7, 5, 2, 2, 596, 598, 3, 2, 2, 2, 597, 448, 3, 2, 2, 2, 597, 450, 3, 2, 2, 2, 597, 457, 3, 2, 2, 2, 597, 459, 3, 2, 2, 2, 597, 464, 3, 2, 2, 2, 597, 479, 3, 2, 2, 2, 597, 494, 3, 2, 2, 2, 597, 495, 3, 2, 2, 2, 597, 510, 3, 2, 2, 2, 597, 529, 3, 2, 2, 2, 597, 531, 3, 2, 2, 2, 597, 547, 3, 2, 2, 2, 597, 549, 3, 2, 2, 2, 597, 563, 3, 2, 2, 2, 597, 578, 3, 2, 2, 2, 597, 586, 3, 2, 2, 2, 597, 589, 3, 2, 2, 2, 597, 593, 3, 2, 2, 2, 598, 648, 3, 2, 2, 2, 599, 600, 12, 28, 2, 2, 600, 601, 7, 33, 2, 2, 601, 647, 5, 44, 23, 28, 602, 603, 12, 26, 2, 2, 603, 604, 9, 2, 2, 2, 604, 647, 5, 44, 23, 27, 605, 606, 12, 25, 2, 2, 606, 607, 9, 3, 2, 2, 607, 647, 5, 44, 23, 26, 608, 609, 12, 24, 2, 2, 609, 610, 9, 4, 2, 2, 610, 647, 5, 44, 23, 25, 611, 612, 12, 22, 2, 2, 612, 613, 7, 62, 2, 2, 613, 614, 5, 44, 23, 23, 614, 615, 8, 23, 1, 2, 615, 647, 3, 2, 2, 2, 616, 617, 12, 20, 2, 2, 617, 618, 7, 45, 2, 2, 618, 647, 5, 44, 23, 21, 619, 620, 12, 18, 2, 2, 620, 621, 7, 46, 2, 2, 621, 647, 5, 44, 23, 19, 622, 623, 12, 17, 2, 2, 623, 624, 7, 47, 2, 2, 624, 647, 5, 44, 23, 18, 625, 626, 12, 16, 2, 2, 626, 627, 7, 48, 2, 2, 627, 647, 5, 44, 23, 17, 628, 629, 12, 9, 2, 2, 629, 630, 7, 28, 2, 2, 630, 647, 5, 44, 23, 10, 631, 632, 12, 32, 2, 2, 632, 633, 7, 24, 2, 2, 633, 639, 5, 74, 38, 2, 634, 636, 7, 63, 2, 2, 635, 637, 5, 68, 35, 2, 636, 635, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 638, 3, 2, 2, 2, 638, 640, 7, 64, 2, 2, 639, 634, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 647, 3, 2, 2, 2, 641, 642, 12, 29, 2, 2, 642, 643, 7, 13, 2, 2, 643, 644, 5, 44, 23, 2, 644, 645, 7, 14, 2, 2, 645, 647, 3, 2, 2, 2, 646, 599, 3, 2, 2, 2, 646, 602, 3, 2, 2, 2, 646, 605, 3, 2, 2, 2, 646, 608, 3, 2, 2, 2, 646, 611, 3, 2, 2, 2, 646, 616, 3, 2, 2, 2, 646, 619, 3, 2, 2, 2, 646, 622, 3, 2, 2, 2, 646, 625, 3, 2, 2, 2, 646, 628, 3, 2, 2, 2, 646, 631, 3, 2, 2, 2, 646, 641, 3, 2, 2, 2, 647, 650, 3, 2, 2, 2, 648, 646, 3, 2, 2, 2, 648, 649, 3, 2, 2, 2, 649, 45, 3, 2, 2, 2, 650, 648, 3, 2, 2, 2, 651, 652, 7, 50, 2, 2, 652, 653, 5, 44, 23, 2, 653, 655, 7, 4, 2, 2, 654, 656, 7, 15, 2, 2, 655, 654, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 657, 3, 2, 2, 2, 657, 662, 5, 48, 25, 2, 658, 659, 7, 15, 2, 2, 659, 661, 5, 48, 25, 2, 660, 658, 3, 2, 2, 2, 661, 664, 3, 2, 2, 2, 662, 660, 3, 2, 2, 2, 662, 663, 3, 2, 2, 2, 663, 665, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 665, 666, 7, 5, 2, 2, 666, 47, 3, 2, 2, 2, 667, 670, 5, 50, 26, 2, 668, 670, 7, 39, 2, 2, 669, 667, 3, 2, 2, 2, 669, 668, 3, 2, 2, 2, 670, 671, 3, 2, 2, 2, 671, 672, 7, 29, 2, 2, 672, 673, 5, 44, 23, 2, 673, 49, 3, 2, 2, 2, 674, 681, 5, 82, 42, 2, 675, 678, 7, 63, 2, 2, 676, 679, 5, 82, 42, 2, 677, 679, 7, 39, 2, 2, 678, 676, 3, 2, 2, 2, 678, 677, 3, 2, 2, 2, 679, 680, 3, 2, 2, 2, 680, 682, 7, 64, 2, 2, 681, 675, 3, 2, 2, 2, 681, 682, 3, 2, 2, 2, 682, 51, 3, 2, 2, 2, 683, 684, 5, 8, 5, 2, 684, 685, 7, 2, 2, 3, 685, 693, 3, 2, 2, 2, 686, 687, 5, 44, 23, 2, 687, 688, 7, 2, 2, 3, 688, 693, 3, 2, 2, 2, 689, 690, 7, 69, 2, 2, 690, 693, 7, 2, 2, 3, 691, 693, 7, 2, 2, 3, 692, 683, 3, 2, 2, 2, 692, 686, 3, 2, 2, 2, 692, 689, 3, 2, 2, 2, 692, 691, 3, 2, 2, 2, 693, 53, 3, 2, 2, 2, 694, 697, 5, 56, 29, 2, 695, 697, 5, 58, 30, 2, 696, 694, 3, 2, 2, 2, 696, 695, 3, 2, 2, 2, 697, 55, 3, 2, 2, 2, 698, 699, 5, 62, 32, 2, 699, 700, 7, 29, 2, 2, 700, 701, 5, 44, 23, 2, 701, 716, 3, 2, 2, 2, 702, 703, 7, 63, 2, 2, 703, 708, 5, 62, 32, 2, 704, 705, 7, 10, 2, 2, 705, 707, 5, 62, 32, 2, 706, 704, 3, 2, 2, 2, 707, 710, 3, 2, 2, 2, 708, 706, 3, 2, 2, 2, 708, 709, 3, 2, 2, 2, 709, 711, 3, 2, 2, 2, 710, 708, 3, 2, 2, 2, 711, 712, 7, 64, 2, 2, 712, 713, 7, 29, 2, 2, 713, 714, 5, 44, 23, 2, 714, 716, 3, 2, 2, 2, 715, 698, 3, 2, 2, 2, 715, 702, 3, 2, 2, 2, 716, 57, 3, 2, 2, 2, 717, 718, 7, 63, 2, 2, 718, 719, 7, 63, 2, 2, 719, 722, 5, 62, 32, 2, 720, 721, 7, 10, 2, 2, 721, 723, 5, 62, 32, 2, 722, 720, 3, 2, 2, 2, 723, 724, 3, 2, 2, 2, 724, 722, 3, 2, 2, 2, 724, 725, 3, 2, 2, 2, 725, 726, 3, 2, 2, 2, 726, 727, 7, 64, 2, 2, 727, 728, 7, 64, 2, 2, 728, 729, 7, 29, 2, 2, 729, 730, 5, 44, 23, 2, 730, 59, 3, 2, 2, 2, 731, 734, 7, 39, 2, 2, 732, 734, 5, 80, 41, 2, 733, 731, 3, 2, 2, 2, 733, 732, 3, 2, 2, 2, 734, 61, 3, 2, 2, 2, 735, 736, 5, 60, 31, 2, 736, 63, 3, 2, 2, 2, 737, 738, 5, 60, 31, 2, 738, 739, 7, 7, 2, 2, 739, 740, 5, 36, 19, 2, 740, 65, 3, 2, 2, 2, 741, 744, 7, 53, 2, 2, 742, 744, 5, 80, 41, 2, 743, 741, 3, 2, 2, 2, 743, 742, 3, 2, 2, 2, 744, 67, 3, 2, 2, 2, 745, 750, 5, 44, 23, 2, 746, 747, 7, 10, 2, 2, 747, 749, 5, 44, 23, 2, 748, 746, 3, 2, 2, 2, 749, 752, 3, 2, 2, 2, 750, 748, 3, 2, 2, 2, 750, 751, 3, 2, 2, 2, 751, 69, 3, 2, 2, 2, 752, 750, 3, 2, 2, 2, 753, 754, 5, 82, 42, 2, 754, 755, 7, 7, 2, 2, 755, 756, 5, 44, 23, 2, 756, 760, 3, 2, 2, 2, 757, 758, 7, 40, 2, 2, 758, 760, 5, 44, 23, 2, 759, 753, 3, 2, 2, 2, 759, 757, 3, 2, 2, 2, 760, 71, 3, 2, 2, 2, 761, 764, 5, 80, 41, 2, 762, 764, 9, 5, 2, 2, 763, 761, 3, 2, 2, 2, 763, 762, 3, 2, 2, 2, 764, 73, 3, 2, 2, 2, 765, 768, 5, 80, 41, 2, 766, 768, 9, 6, 2, 2, 767, 765, 3, 2, 2, 2, 767, 766, 3, 2, 2, 2, 768, 75, 3, 2, 2, 2, 769, 770, 9, 7, 2, 2, 770, 77, 3, 2, 2, 2, 771, 772, 9, 8, 2, 2, 772, 79, 3, 2, 2, 2, 773, 778, 5, 84, 43, 2, 774, 775, 7, 41, 2, 2, 775, 777, 5, 84, 43, 2, 776, 774, 3, 2, 2, 2, 777, 780, 3, 2, 2, 2, 778, 776, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 81, 3, 2, 2, 2, 780, 778, 3, 2, 2, 2, 781, 786, 5, 84, 43, 2, 782, 783, 5, 80, 41, 2, 783, 784, 8, 42, 1, 2, 784, 786, 3, 2, 2, 2, 785, 781, 3, 2, 2, 2, 785, 782, 3, 2, 2, 2, 786, 83, 3, 2, 2, 2, 787, 788, 9, 9, 2, 2, 788, 85, 3, 2, 2, 2, 88, 89, 96, 105, 113, 138, 148, 156, 159, 169, 172, 175, 179, 183, 186, 188, 202, 211, 215, 218, 225, 233, 245, 253, 259, 263, 265, 276, 278, 293, 301, 316, 324, 326, 343, 346, 349, 374, 378, 384, 403, 408, 416, 418, 434, 440, 444, 453, 471, 475, 486, 490, 502, 506, 517, 521, 529, 539, 543, 555, 559, 569, 572, 575, 597, 636, 639, 646, 648, 655, 662, 669, 678, 681, 692, 696, 708, 715, 724, 733, 743, 750, 759, 763, 767, 778, 785] \ No newline at end of file diff --git a/quint/src/generated/Quint.tokens b/quint/src/generated/Quint.tokens index 427758cd2..1d1d2dd5d 100644 --- a/quint/src/generated/Quint.tokens +++ b/quint/src/generated/Quint.tokens @@ -44,29 +44,30 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 -IDENTIFIER=65 -DOCCOMMENT=66 -LINE_COMMENT=67 -COMMENT=68 -WS=69 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 +LOW_ID=65 +CAP_ID=66 +DOCCOMMENT=67 +LINE_COMMENT=68 +COMMENT=69 +WS=70 'module'=1 '{'=2 '}'=3 @@ -77,23 +78,23 @@ WS=69 ','=8 ';'=9 'type'=10 -'|'=11 -'nondet'=12 -'val'=13 -'def'=14 -'pure'=15 -'action'=16 -'run'=17 -'temporal'=18 -'import'=19 -'.'=20 -'from'=21 -'as'=22 -'export'=23 -'->'=24 -'=>'=25 -'['=26 -']'=27 +'['=11 +']'=12 +'|'=13 +'val'=14 +'def'=15 +'pure'=16 +'action'=17 +'run'=18 +'temporal'=19 +'nondet'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -110,21 +111,21 @@ WS=69 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.interp b/quint/src/generated/QuintLexer.interp index 700db184e..2e082080a 100644 --- a/quint/src/generated/QuintLexer.interp +++ b/quint/src/generated/QuintLexer.interp @@ -10,14 +10,16 @@ null ',' ';' 'type' +'[' +']' '|' -'nondet' 'val' 'def' 'pure' 'action' 'run' 'temporal' +'nondet' 'import' '.' 'from' @@ -25,8 +27,6 @@ null 'export' '->' '=>' -'[' -']' 'int' 'str' 'bool' @@ -46,8 +46,6 @@ null 'or' 'iff' 'implies' -'Set' -'List' 'Map' 'match' '+' @@ -64,6 +62,9 @@ null '=' '(' ')' +'Set' +'List' +null null null null @@ -118,8 +119,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -136,7 +135,10 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +SET +LIST +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -189,8 +191,6 @@ AND OR IFF IMPLIES -SET -LIST MAP MATCH PLUS @@ -207,7 +207,10 @@ EQ ASGN LPAREN RPAREN -IDENTIFIER +SET +LIST +LOW_ID +CAP_ID DOCCOMMENT LINE_COMMENT COMMENT @@ -221,4 +224,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 71, 473, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 301, 10, 41, 12, 41, 14, 41, 304, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 317, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 324, 10, 43, 12, 43, 14, 43, 327, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 336, 10, 43, 12, 43, 14, 43, 339, 11, 43, 5, 43, 341, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 415, 10, 66, 12, 66, 14, 66, 418, 11, 66, 3, 66, 3, 66, 6, 66, 422, 10, 66, 13, 66, 14, 66, 423, 5, 66, 426, 10, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 7, 67, 433, 10, 67, 12, 67, 14, 67, 436, 11, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 444, 10, 68, 12, 68, 14, 68, 447, 11, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 457, 10, 69, 12, 69, 14, 69, 460, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 6, 70, 468, 10, 70, 13, 70, 14, 70, 469, 3, 70, 3, 70, 6, 302, 434, 445, 458, 2, 2, 71, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 3, 2, 9, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 67, 92, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 5, 2, 11, 12, 15, 15, 34, 34, 2, 487, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 3, 141, 3, 2, 2, 2, 5, 148, 3, 2, 2, 2, 7, 150, 3, 2, 2, 2, 9, 152, 3, 2, 2, 2, 11, 158, 3, 2, 2, 2, 13, 160, 3, 2, 2, 2, 15, 164, 3, 2, 2, 2, 17, 171, 3, 2, 2, 2, 19, 173, 3, 2, 2, 2, 21, 175, 3, 2, 2, 2, 23, 180, 3, 2, 2, 2, 25, 182, 3, 2, 2, 2, 27, 189, 3, 2, 2, 2, 29, 193, 3, 2, 2, 2, 31, 197, 3, 2, 2, 2, 33, 202, 3, 2, 2, 2, 35, 209, 3, 2, 2, 2, 37, 213, 3, 2, 2, 2, 39, 222, 3, 2, 2, 2, 41, 229, 3, 2, 2, 2, 43, 231, 3, 2, 2, 2, 45, 236, 3, 2, 2, 2, 47, 239, 3, 2, 2, 2, 49, 246, 3, 2, 2, 2, 51, 249, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 254, 3, 2, 2, 2, 57, 256, 3, 2, 2, 2, 59, 260, 3, 2, 2, 2, 61, 264, 3, 2, 2, 2, 63, 269, 3, 2, 2, 2, 65, 271, 3, 2, 2, 2, 67, 273, 3, 2, 2, 2, 69, 277, 3, 2, 2, 2, 71, 281, 3, 2, 2, 2, 73, 284, 3, 2, 2, 2, 75, 289, 3, 2, 2, 2, 77, 291, 3, 2, 2, 2, 79, 295, 3, 2, 2, 2, 81, 298, 3, 2, 2, 2, 83, 316, 3, 2, 2, 2, 85, 340, 3, 2, 2, 2, 87, 342, 3, 2, 2, 2, 89, 346, 3, 2, 2, 2, 91, 349, 3, 2, 2, 2, 93, 353, 3, 2, 2, 2, 95, 361, 3, 2, 2, 2, 97, 365, 3, 2, 2, 2, 99, 370, 3, 2, 2, 2, 101, 374, 3, 2, 2, 2, 103, 380, 3, 2, 2, 2, 105, 382, 3, 2, 2, 2, 107, 384, 3, 2, 2, 2, 109, 386, 3, 2, 2, 2, 111, 388, 3, 2, 2, 2, 113, 390, 3, 2, 2, 2, 115, 392, 3, 2, 2, 2, 117, 394, 3, 2, 2, 2, 119, 397, 3, 2, 2, 2, 121, 400, 3, 2, 2, 2, 123, 403, 3, 2, 2, 2, 125, 406, 3, 2, 2, 2, 127, 408, 3, 2, 2, 2, 129, 410, 3, 2, 2, 2, 131, 425, 3, 2, 2, 2, 133, 427, 3, 2, 2, 2, 135, 439, 3, 2, 2, 2, 137, 452, 3, 2, 2, 2, 139, 467, 3, 2, 2, 2, 141, 142, 7, 111, 2, 2, 142, 143, 7, 113, 2, 2, 143, 144, 7, 102, 2, 2, 144, 145, 7, 119, 2, 2, 145, 146, 7, 110, 2, 2, 146, 147, 7, 103, 2, 2, 147, 4, 3, 2, 2, 2, 148, 149, 7, 125, 2, 2, 149, 6, 3, 2, 2, 2, 150, 151, 7, 127, 2, 2, 151, 8, 3, 2, 2, 2, 152, 153, 7, 101, 2, 2, 153, 154, 7, 113, 2, 2, 154, 155, 7, 112, 2, 2, 155, 156, 7, 117, 2, 2, 156, 157, 7, 118, 2, 2, 157, 10, 3, 2, 2, 2, 158, 159, 7, 60, 2, 2, 159, 12, 3, 2, 2, 2, 160, 161, 7, 120, 2, 2, 161, 162, 7, 99, 2, 2, 162, 163, 7, 116, 2, 2, 163, 14, 3, 2, 2, 2, 164, 165, 7, 99, 2, 2, 165, 166, 7, 117, 2, 2, 166, 167, 7, 117, 2, 2, 167, 168, 7, 119, 2, 2, 168, 169, 7, 111, 2, 2, 169, 170, 7, 103, 2, 2, 170, 16, 3, 2, 2, 2, 171, 172, 7, 46, 2, 2, 172, 18, 3, 2, 2, 2, 173, 174, 7, 61, 2, 2, 174, 20, 3, 2, 2, 2, 175, 176, 7, 118, 2, 2, 176, 177, 7, 123, 2, 2, 177, 178, 7, 114, 2, 2, 178, 179, 7, 103, 2, 2, 179, 22, 3, 2, 2, 2, 180, 181, 7, 126, 2, 2, 181, 24, 3, 2, 2, 2, 182, 183, 7, 112, 2, 2, 183, 184, 7, 113, 2, 2, 184, 185, 7, 112, 2, 2, 185, 186, 7, 102, 2, 2, 186, 187, 7, 103, 2, 2, 187, 188, 7, 118, 2, 2, 188, 26, 3, 2, 2, 2, 189, 190, 7, 120, 2, 2, 190, 191, 7, 99, 2, 2, 191, 192, 7, 110, 2, 2, 192, 28, 3, 2, 2, 2, 193, 194, 7, 102, 2, 2, 194, 195, 7, 103, 2, 2, 195, 196, 7, 104, 2, 2, 196, 30, 3, 2, 2, 2, 197, 198, 7, 114, 2, 2, 198, 199, 7, 119, 2, 2, 199, 200, 7, 116, 2, 2, 200, 201, 7, 103, 2, 2, 201, 32, 3, 2, 2, 2, 202, 203, 7, 99, 2, 2, 203, 204, 7, 101, 2, 2, 204, 205, 7, 118, 2, 2, 205, 206, 7, 107, 2, 2, 206, 207, 7, 113, 2, 2, 207, 208, 7, 112, 2, 2, 208, 34, 3, 2, 2, 2, 209, 210, 7, 116, 2, 2, 210, 211, 7, 119, 2, 2, 211, 212, 7, 112, 2, 2, 212, 36, 3, 2, 2, 2, 213, 214, 7, 118, 2, 2, 214, 215, 7, 103, 2, 2, 215, 216, 7, 111, 2, 2, 216, 217, 7, 114, 2, 2, 217, 218, 7, 113, 2, 2, 218, 219, 7, 116, 2, 2, 219, 220, 7, 99, 2, 2, 220, 221, 7, 110, 2, 2, 221, 38, 3, 2, 2, 2, 222, 223, 7, 107, 2, 2, 223, 224, 7, 111, 2, 2, 224, 225, 7, 114, 2, 2, 225, 226, 7, 113, 2, 2, 226, 227, 7, 116, 2, 2, 227, 228, 7, 118, 2, 2, 228, 40, 3, 2, 2, 2, 229, 230, 7, 48, 2, 2, 230, 42, 3, 2, 2, 2, 231, 232, 7, 104, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 113, 2, 2, 234, 235, 7, 111, 2, 2, 235, 44, 3, 2, 2, 2, 236, 237, 7, 99, 2, 2, 237, 238, 7, 117, 2, 2, 238, 46, 3, 2, 2, 2, 239, 240, 7, 103, 2, 2, 240, 241, 7, 122, 2, 2, 241, 242, 7, 114, 2, 2, 242, 243, 7, 113, 2, 2, 243, 244, 7, 116, 2, 2, 244, 245, 7, 118, 2, 2, 245, 48, 3, 2, 2, 2, 246, 247, 7, 47, 2, 2, 247, 248, 7, 64, 2, 2, 248, 50, 3, 2, 2, 2, 249, 250, 7, 63, 2, 2, 250, 251, 7, 64, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 93, 2, 2, 253, 54, 3, 2, 2, 2, 254, 255, 7, 95, 2, 2, 255, 56, 3, 2, 2, 2, 256, 257, 7, 107, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 118, 2, 2, 259, 58, 3, 2, 2, 2, 260, 261, 7, 117, 2, 2, 261, 262, 7, 118, 2, 2, 262, 263, 7, 116, 2, 2, 263, 60, 3, 2, 2, 2, 264, 265, 7, 100, 2, 2, 265, 266, 7, 113, 2, 2, 266, 267, 7, 113, 2, 2, 267, 268, 7, 110, 2, 2, 268, 62, 3, 2, 2, 2, 269, 270, 7, 96, 2, 2, 270, 64, 3, 2, 2, 2, 271, 272, 7, 41, 2, 2, 272, 66, 3, 2, 2, 2, 273, 274, 7, 99, 2, 2, 274, 275, 7, 110, 2, 2, 275, 276, 7, 110, 2, 2, 276, 68, 3, 2, 2, 2, 277, 278, 7, 99, 2, 2, 278, 279, 7, 112, 2, 2, 279, 280, 7, 123, 2, 2, 280, 70, 3, 2, 2, 2, 281, 282, 7, 107, 2, 2, 282, 283, 7, 104, 2, 2, 283, 72, 3, 2, 2, 2, 284, 285, 7, 103, 2, 2, 285, 286, 7, 110, 2, 2, 286, 287, 7, 117, 2, 2, 287, 288, 7, 103, 2, 2, 288, 74, 3, 2, 2, 2, 289, 290, 7, 97, 2, 2, 290, 76, 3, 2, 2, 2, 291, 292, 7, 48, 2, 2, 292, 293, 7, 48, 2, 2, 293, 294, 7, 48, 2, 2, 294, 78, 3, 2, 2, 2, 295, 296, 7, 60, 2, 2, 296, 297, 7, 60, 2, 2, 297, 80, 3, 2, 2, 2, 298, 302, 7, 36, 2, 2, 299, 301, 11, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 304, 3, 2, 2, 2, 302, 303, 3, 2, 2, 2, 302, 300, 3, 2, 2, 2, 303, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 306, 7, 36, 2, 2, 306, 82, 3, 2, 2, 2, 307, 308, 7, 104, 2, 2, 308, 309, 7, 99, 2, 2, 309, 310, 7, 110, 2, 2, 310, 311, 7, 117, 2, 2, 311, 317, 7, 103, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 119, 2, 2, 315, 317, 7, 103, 2, 2, 316, 307, 3, 2, 2, 2, 316, 312, 3, 2, 2, 2, 317, 84, 3, 2, 2, 2, 318, 341, 7, 50, 2, 2, 319, 325, 9, 2, 2, 2, 320, 324, 9, 3, 2, 2, 321, 322, 7, 97, 2, 2, 322, 324, 9, 3, 2, 2, 323, 320, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 341, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 329, 7, 50, 2, 2, 329, 330, 7, 122, 2, 2, 330, 331, 3, 2, 2, 2, 331, 337, 9, 4, 2, 2, 332, 336, 9, 4, 2, 2, 333, 334, 7, 97, 2, 2, 334, 336, 9, 4, 2, 2, 335, 332, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 339, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 337, 338, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 340, 318, 3, 2, 2, 2, 340, 319, 3, 2, 2, 2, 340, 328, 3, 2, 2, 2, 341, 86, 3, 2, 2, 2, 342, 343, 7, 99, 2, 2, 343, 344, 7, 112, 2, 2, 344, 345, 7, 102, 2, 2, 345, 88, 3, 2, 2, 2, 346, 347, 7, 113, 2, 2, 347, 348, 7, 116, 2, 2, 348, 90, 3, 2, 2, 2, 349, 350, 7, 107, 2, 2, 350, 351, 7, 104, 2, 2, 351, 352, 7, 104, 2, 2, 352, 92, 3, 2, 2, 2, 353, 354, 7, 107, 2, 2, 354, 355, 7, 111, 2, 2, 355, 356, 7, 114, 2, 2, 356, 357, 7, 110, 2, 2, 357, 358, 7, 107, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 117, 2, 2, 360, 94, 3, 2, 2, 2, 361, 362, 7, 85, 2, 2, 362, 363, 7, 103, 2, 2, 363, 364, 7, 118, 2, 2, 364, 96, 3, 2, 2, 2, 365, 366, 7, 78, 2, 2, 366, 367, 7, 107, 2, 2, 367, 368, 7, 117, 2, 2, 368, 369, 7, 118, 2, 2, 369, 98, 3, 2, 2, 2, 370, 371, 7, 79, 2, 2, 371, 372, 7, 99, 2, 2, 372, 373, 7, 114, 2, 2, 373, 100, 3, 2, 2, 2, 374, 375, 7, 111, 2, 2, 375, 376, 7, 99, 2, 2, 376, 377, 7, 118, 2, 2, 377, 378, 7, 101, 2, 2, 378, 379, 7, 106, 2, 2, 379, 102, 3, 2, 2, 2, 380, 381, 7, 45, 2, 2, 381, 104, 3, 2, 2, 2, 382, 383, 7, 47, 2, 2, 383, 106, 3, 2, 2, 2, 384, 385, 7, 44, 2, 2, 385, 108, 3, 2, 2, 2, 386, 387, 7, 49, 2, 2, 387, 110, 3, 2, 2, 2, 388, 389, 7, 39, 2, 2, 389, 112, 3, 2, 2, 2, 390, 391, 7, 64, 2, 2, 391, 114, 3, 2, 2, 2, 392, 393, 7, 62, 2, 2, 393, 116, 3, 2, 2, 2, 394, 395, 7, 64, 2, 2, 395, 396, 7, 63, 2, 2, 396, 118, 3, 2, 2, 2, 397, 398, 7, 62, 2, 2, 398, 399, 7, 63, 2, 2, 399, 120, 3, 2, 2, 2, 400, 401, 7, 35, 2, 2, 401, 402, 7, 63, 2, 2, 402, 122, 3, 2, 2, 2, 403, 404, 7, 63, 2, 2, 404, 405, 7, 63, 2, 2, 405, 124, 3, 2, 2, 2, 406, 407, 7, 63, 2, 2, 407, 126, 3, 2, 2, 2, 408, 409, 7, 42, 2, 2, 409, 128, 3, 2, 2, 2, 410, 411, 7, 43, 2, 2, 411, 130, 3, 2, 2, 2, 412, 416, 9, 5, 2, 2, 413, 415, 9, 6, 2, 2, 414, 413, 3, 2, 2, 2, 415, 418, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 426, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 419, 421, 9, 7, 2, 2, 420, 422, 9, 6, 2, 2, 421, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 412, 3, 2, 2, 2, 425, 419, 3, 2, 2, 2, 426, 132, 3, 2, 2, 2, 427, 428, 7, 49, 2, 2, 428, 429, 7, 49, 2, 2, 429, 430, 7, 49, 2, 2, 430, 434, 3, 2, 2, 2, 431, 433, 11, 2, 2, 2, 432, 431, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 437, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 438, 7, 12, 2, 2, 438, 134, 3, 2, 2, 2, 439, 440, 7, 49, 2, 2, 440, 441, 7, 49, 2, 2, 441, 445, 3, 2, 2, 2, 442, 444, 11, 2, 2, 2, 443, 442, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 446, 448, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 449, 7, 12, 2, 2, 449, 450, 3, 2, 2, 2, 450, 451, 8, 68, 2, 2, 451, 136, 3, 2, 2, 2, 452, 453, 7, 49, 2, 2, 453, 454, 7, 44, 2, 2, 454, 458, 3, 2, 2, 2, 455, 457, 11, 2, 2, 2, 456, 455, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 459, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 461, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 461, 462, 7, 44, 2, 2, 462, 463, 7, 49, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 8, 69, 2, 2, 465, 138, 3, 2, 2, 2, 466, 468, 9, 8, 2, 2, 467, 466, 3, 2, 2, 2, 468, 469, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 8, 70, 2, 2, 472, 140, 3, 2, 2, 2, 17, 2, 302, 316, 323, 325, 335, 337, 340, 416, 423, 425, 434, 445, 458, 469, 3, 8, 2, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 72, 490, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 7, 41, 303, 10, 41, 12, 41, 14, 41, 306, 11, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 319, 10, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 326, 10, 43, 12, 43, 14, 43, 329, 11, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 7, 43, 338, 10, 43, 12, 43, 14, 43, 341, 11, 43, 5, 43, 343, 10, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 7, 66, 417, 10, 66, 12, 66, 14, 66, 420, 11, 66, 3, 66, 3, 66, 6, 66, 424, 10, 66, 13, 66, 14, 66, 425, 5, 66, 428, 10, 66, 3, 67, 3, 67, 7, 67, 432, 10, 67, 12, 67, 14, 67, 435, 11, 67, 3, 67, 3, 67, 6, 67, 439, 10, 67, 13, 67, 14, 67, 440, 5, 67, 443, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 7, 68, 450, 10, 68, 12, 68, 14, 68, 453, 11, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 7, 69, 461, 10, 69, 12, 69, 14, 69, 464, 11, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 7, 70, 474, 10, 70, 12, 70, 14, 70, 477, 11, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 6, 71, 485, 10, 71, 13, 71, 14, 71, 486, 3, 71, 3, 71, 6, 304, 451, 462, 475, 2, 2, 72, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 14, 27, 2, 15, 29, 2, 16, 31, 2, 17, 33, 2, 18, 35, 2, 19, 37, 2, 20, 39, 2, 21, 41, 2, 22, 43, 2, 23, 45, 2, 24, 47, 2, 25, 49, 2, 26, 51, 2, 27, 53, 2, 28, 55, 2, 29, 57, 2, 30, 59, 2, 31, 61, 2, 32, 63, 2, 33, 65, 2, 34, 67, 2, 35, 69, 2, 36, 71, 2, 37, 73, 2, 38, 75, 2, 39, 77, 2, 40, 79, 2, 41, 81, 2, 42, 83, 2, 43, 85, 2, 44, 87, 2, 45, 89, 2, 46, 91, 2, 47, 93, 2, 48, 95, 2, 49, 97, 2, 50, 99, 2, 51, 101, 2, 52, 103, 2, 53, 105, 2, 54, 107, 2, 55, 109, 2, 56, 111, 2, 57, 113, 2, 58, 115, 2, 59, 117, 2, 60, 119, 2, 61, 121, 2, 62, 123, 2, 63, 125, 2, 64, 127, 2, 65, 129, 2, 66, 131, 2, 67, 133, 2, 68, 135, 2, 69, 137, 2, 70, 139, 2, 71, 141, 2, 72, 3, 2, 10, 3, 2, 51, 59, 3, 2, 50, 59, 5, 2, 50, 59, 67, 72, 99, 104, 3, 2, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 97, 97, 3, 2, 67, 92, 5, 2, 11, 12, 15, 15, 34, 34, 2, 507, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 3, 143, 3, 2, 2, 2, 5, 150, 3, 2, 2, 2, 7, 152, 3, 2, 2, 2, 9, 154, 3, 2, 2, 2, 11, 160, 3, 2, 2, 2, 13, 162, 3, 2, 2, 2, 15, 166, 3, 2, 2, 2, 17, 173, 3, 2, 2, 2, 19, 175, 3, 2, 2, 2, 21, 177, 3, 2, 2, 2, 23, 182, 3, 2, 2, 2, 25, 184, 3, 2, 2, 2, 27, 186, 3, 2, 2, 2, 29, 188, 3, 2, 2, 2, 31, 192, 3, 2, 2, 2, 33, 196, 3, 2, 2, 2, 35, 201, 3, 2, 2, 2, 37, 208, 3, 2, 2, 2, 39, 212, 3, 2, 2, 2, 41, 221, 3, 2, 2, 2, 43, 228, 3, 2, 2, 2, 45, 235, 3, 2, 2, 2, 47, 237, 3, 2, 2, 2, 49, 242, 3, 2, 2, 2, 51, 245, 3, 2, 2, 2, 53, 252, 3, 2, 2, 2, 55, 255, 3, 2, 2, 2, 57, 258, 3, 2, 2, 2, 59, 262, 3, 2, 2, 2, 61, 266, 3, 2, 2, 2, 63, 271, 3, 2, 2, 2, 65, 273, 3, 2, 2, 2, 67, 275, 3, 2, 2, 2, 69, 279, 3, 2, 2, 2, 71, 283, 3, 2, 2, 2, 73, 286, 3, 2, 2, 2, 75, 291, 3, 2, 2, 2, 77, 293, 3, 2, 2, 2, 79, 297, 3, 2, 2, 2, 81, 300, 3, 2, 2, 2, 83, 318, 3, 2, 2, 2, 85, 342, 3, 2, 2, 2, 87, 344, 3, 2, 2, 2, 89, 348, 3, 2, 2, 2, 91, 351, 3, 2, 2, 2, 93, 355, 3, 2, 2, 2, 95, 363, 3, 2, 2, 2, 97, 367, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 377, 3, 2, 2, 2, 105, 379, 3, 2, 2, 2, 107, 381, 3, 2, 2, 2, 109, 383, 3, 2, 2, 2, 111, 385, 3, 2, 2, 2, 113, 387, 3, 2, 2, 2, 115, 390, 3, 2, 2, 2, 117, 393, 3, 2, 2, 2, 119, 396, 3, 2, 2, 2, 121, 399, 3, 2, 2, 2, 123, 401, 3, 2, 2, 2, 125, 403, 3, 2, 2, 2, 127, 405, 3, 2, 2, 2, 129, 409, 3, 2, 2, 2, 131, 427, 3, 2, 2, 2, 133, 442, 3, 2, 2, 2, 135, 444, 3, 2, 2, 2, 137, 456, 3, 2, 2, 2, 139, 469, 3, 2, 2, 2, 141, 484, 3, 2, 2, 2, 143, 144, 7, 111, 2, 2, 144, 145, 7, 113, 2, 2, 145, 146, 7, 102, 2, 2, 146, 147, 7, 119, 2, 2, 147, 148, 7, 110, 2, 2, 148, 149, 7, 103, 2, 2, 149, 4, 3, 2, 2, 2, 150, 151, 7, 125, 2, 2, 151, 6, 3, 2, 2, 2, 152, 153, 7, 127, 2, 2, 153, 8, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 113, 2, 2, 156, 157, 7, 112, 2, 2, 157, 158, 7, 117, 2, 2, 158, 159, 7, 118, 2, 2, 159, 10, 3, 2, 2, 2, 160, 161, 7, 60, 2, 2, 161, 12, 3, 2, 2, 2, 162, 163, 7, 120, 2, 2, 163, 164, 7, 99, 2, 2, 164, 165, 7, 116, 2, 2, 165, 14, 3, 2, 2, 2, 166, 167, 7, 99, 2, 2, 167, 168, 7, 117, 2, 2, 168, 169, 7, 117, 2, 2, 169, 170, 7, 119, 2, 2, 170, 171, 7, 111, 2, 2, 171, 172, 7, 103, 2, 2, 172, 16, 3, 2, 2, 2, 173, 174, 7, 46, 2, 2, 174, 18, 3, 2, 2, 2, 175, 176, 7, 61, 2, 2, 176, 20, 3, 2, 2, 2, 177, 178, 7, 118, 2, 2, 178, 179, 7, 123, 2, 2, 179, 180, 7, 114, 2, 2, 180, 181, 7, 103, 2, 2, 181, 22, 3, 2, 2, 2, 182, 183, 7, 93, 2, 2, 183, 24, 3, 2, 2, 2, 184, 185, 7, 95, 2, 2, 185, 26, 3, 2, 2, 2, 186, 187, 7, 126, 2, 2, 187, 28, 3, 2, 2, 2, 188, 189, 7, 120, 2, 2, 189, 190, 7, 99, 2, 2, 190, 191, 7, 110, 2, 2, 191, 30, 3, 2, 2, 2, 192, 193, 7, 102, 2, 2, 193, 194, 7, 103, 2, 2, 194, 195, 7, 104, 2, 2, 195, 32, 3, 2, 2, 2, 196, 197, 7, 114, 2, 2, 197, 198, 7, 119, 2, 2, 198, 199, 7, 116, 2, 2, 199, 200, 7, 103, 2, 2, 200, 34, 3, 2, 2, 2, 201, 202, 7, 99, 2, 2, 202, 203, 7, 101, 2, 2, 203, 204, 7, 118, 2, 2, 204, 205, 7, 107, 2, 2, 205, 206, 7, 113, 2, 2, 206, 207, 7, 112, 2, 2, 207, 36, 3, 2, 2, 2, 208, 209, 7, 116, 2, 2, 209, 210, 7, 119, 2, 2, 210, 211, 7, 112, 2, 2, 211, 38, 3, 2, 2, 2, 212, 213, 7, 118, 2, 2, 213, 214, 7, 103, 2, 2, 214, 215, 7, 111, 2, 2, 215, 216, 7, 114, 2, 2, 216, 217, 7, 113, 2, 2, 217, 218, 7, 116, 2, 2, 218, 219, 7, 99, 2, 2, 219, 220, 7, 110, 2, 2, 220, 40, 3, 2, 2, 2, 221, 222, 7, 112, 2, 2, 222, 223, 7, 113, 2, 2, 223, 224, 7, 112, 2, 2, 224, 225, 7, 102, 2, 2, 225, 226, 7, 103, 2, 2, 226, 227, 7, 118, 2, 2, 227, 42, 3, 2, 2, 2, 228, 229, 7, 107, 2, 2, 229, 230, 7, 111, 2, 2, 230, 231, 7, 114, 2, 2, 231, 232, 7, 113, 2, 2, 232, 233, 7, 116, 2, 2, 233, 234, 7, 118, 2, 2, 234, 44, 3, 2, 2, 2, 235, 236, 7, 48, 2, 2, 236, 46, 3, 2, 2, 2, 237, 238, 7, 104, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 113, 2, 2, 240, 241, 7, 111, 2, 2, 241, 48, 3, 2, 2, 2, 242, 243, 7, 99, 2, 2, 243, 244, 7, 117, 2, 2, 244, 50, 3, 2, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 122, 2, 2, 247, 248, 7, 114, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 118, 2, 2, 251, 52, 3, 2, 2, 2, 252, 253, 7, 47, 2, 2, 253, 254, 7, 64, 2, 2, 254, 54, 3, 2, 2, 2, 255, 256, 7, 63, 2, 2, 256, 257, 7, 64, 2, 2, 257, 56, 3, 2, 2, 2, 258, 259, 7, 107, 2, 2, 259, 260, 7, 112, 2, 2, 260, 261, 7, 118, 2, 2, 261, 58, 3, 2, 2, 2, 262, 263, 7, 117, 2, 2, 263, 264, 7, 118, 2, 2, 264, 265, 7, 116, 2, 2, 265, 60, 3, 2, 2, 2, 266, 267, 7, 100, 2, 2, 267, 268, 7, 113, 2, 2, 268, 269, 7, 113, 2, 2, 269, 270, 7, 110, 2, 2, 270, 62, 3, 2, 2, 2, 271, 272, 7, 96, 2, 2, 272, 64, 3, 2, 2, 2, 273, 274, 7, 41, 2, 2, 274, 66, 3, 2, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 110, 2, 2, 277, 278, 7, 110, 2, 2, 278, 68, 3, 2, 2, 2, 279, 280, 7, 99, 2, 2, 280, 281, 7, 112, 2, 2, 281, 282, 7, 123, 2, 2, 282, 70, 3, 2, 2, 2, 283, 284, 7, 107, 2, 2, 284, 285, 7, 104, 2, 2, 285, 72, 3, 2, 2, 2, 286, 287, 7, 103, 2, 2, 287, 288, 7, 110, 2, 2, 288, 289, 7, 117, 2, 2, 289, 290, 7, 103, 2, 2, 290, 74, 3, 2, 2, 2, 291, 292, 7, 97, 2, 2, 292, 76, 3, 2, 2, 2, 293, 294, 7, 48, 2, 2, 294, 295, 7, 48, 2, 2, 295, 296, 7, 48, 2, 2, 296, 78, 3, 2, 2, 2, 297, 298, 7, 60, 2, 2, 298, 299, 7, 60, 2, 2, 299, 80, 3, 2, 2, 2, 300, 304, 7, 36, 2, 2, 301, 303, 11, 2, 2, 2, 302, 301, 3, 2, 2, 2, 303, 306, 3, 2, 2, 2, 304, 305, 3, 2, 2, 2, 304, 302, 3, 2, 2, 2, 305, 307, 3, 2, 2, 2, 306, 304, 3, 2, 2, 2, 307, 308, 7, 36, 2, 2, 308, 82, 3, 2, 2, 2, 309, 310, 7, 104, 2, 2, 310, 311, 7, 99, 2, 2, 311, 312, 7, 110, 2, 2, 312, 313, 7, 117, 2, 2, 313, 319, 7, 103, 2, 2, 314, 315, 7, 118, 2, 2, 315, 316, 7, 116, 2, 2, 316, 317, 7, 119, 2, 2, 317, 319, 7, 103, 2, 2, 318, 309, 3, 2, 2, 2, 318, 314, 3, 2, 2, 2, 319, 84, 3, 2, 2, 2, 320, 343, 7, 50, 2, 2, 321, 327, 9, 2, 2, 2, 322, 326, 9, 3, 2, 2, 323, 324, 7, 97, 2, 2, 324, 326, 9, 3, 2, 2, 325, 322, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 343, 3, 2, 2, 2, 329, 327, 3, 2, 2, 2, 330, 331, 7, 50, 2, 2, 331, 332, 7, 122, 2, 2, 332, 333, 3, 2, 2, 2, 333, 339, 9, 4, 2, 2, 334, 338, 9, 4, 2, 2, 335, 336, 7, 97, 2, 2, 336, 338, 9, 4, 2, 2, 337, 334, 3, 2, 2, 2, 337, 335, 3, 2, 2, 2, 338, 341, 3, 2, 2, 2, 339, 337, 3, 2, 2, 2, 339, 340, 3, 2, 2, 2, 340, 343, 3, 2, 2, 2, 341, 339, 3, 2, 2, 2, 342, 320, 3, 2, 2, 2, 342, 321, 3, 2, 2, 2, 342, 330, 3, 2, 2, 2, 343, 86, 3, 2, 2, 2, 344, 345, 7, 99, 2, 2, 345, 346, 7, 112, 2, 2, 346, 347, 7, 102, 2, 2, 347, 88, 3, 2, 2, 2, 348, 349, 7, 113, 2, 2, 349, 350, 7, 116, 2, 2, 350, 90, 3, 2, 2, 2, 351, 352, 7, 107, 2, 2, 352, 353, 7, 104, 2, 2, 353, 354, 7, 104, 2, 2, 354, 92, 3, 2, 2, 2, 355, 356, 7, 107, 2, 2, 356, 357, 7, 111, 2, 2, 357, 358, 7, 114, 2, 2, 358, 359, 7, 110, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 103, 2, 2, 361, 362, 7, 117, 2, 2, 362, 94, 3, 2, 2, 2, 363, 364, 7, 79, 2, 2, 364, 365, 7, 99, 2, 2, 365, 366, 7, 114, 2, 2, 366, 96, 3, 2, 2, 2, 367, 368, 7, 111, 2, 2, 368, 369, 7, 99, 2, 2, 369, 370, 7, 118, 2, 2, 370, 371, 7, 101, 2, 2, 371, 372, 7, 106, 2, 2, 372, 98, 3, 2, 2, 2, 373, 374, 7, 45, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 7, 47, 2, 2, 376, 102, 3, 2, 2, 2, 377, 378, 7, 44, 2, 2, 378, 104, 3, 2, 2, 2, 379, 380, 7, 49, 2, 2, 380, 106, 3, 2, 2, 2, 381, 382, 7, 39, 2, 2, 382, 108, 3, 2, 2, 2, 383, 384, 7, 64, 2, 2, 384, 110, 3, 2, 2, 2, 385, 386, 7, 62, 2, 2, 386, 112, 3, 2, 2, 2, 387, 388, 7, 64, 2, 2, 388, 389, 7, 63, 2, 2, 389, 114, 3, 2, 2, 2, 390, 391, 7, 62, 2, 2, 391, 392, 7, 63, 2, 2, 392, 116, 3, 2, 2, 2, 393, 394, 7, 35, 2, 2, 394, 395, 7, 63, 2, 2, 395, 118, 3, 2, 2, 2, 396, 397, 7, 63, 2, 2, 397, 398, 7, 63, 2, 2, 398, 120, 3, 2, 2, 2, 399, 400, 7, 63, 2, 2, 400, 122, 3, 2, 2, 2, 401, 402, 7, 42, 2, 2, 402, 124, 3, 2, 2, 2, 403, 404, 7, 43, 2, 2, 404, 126, 3, 2, 2, 2, 405, 406, 7, 85, 2, 2, 406, 407, 7, 103, 2, 2, 407, 408, 7, 118, 2, 2, 408, 128, 3, 2, 2, 2, 409, 410, 7, 78, 2, 2, 410, 411, 7, 107, 2, 2, 411, 412, 7, 117, 2, 2, 412, 413, 7, 118, 2, 2, 413, 130, 3, 2, 2, 2, 414, 418, 9, 5, 2, 2, 415, 417, 9, 6, 2, 2, 416, 415, 3, 2, 2, 2, 417, 420, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 428, 3, 2, 2, 2, 420, 418, 3, 2, 2, 2, 421, 423, 9, 7, 2, 2, 422, 424, 9, 6, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 428, 3, 2, 2, 2, 427, 414, 3, 2, 2, 2, 427, 421, 3, 2, 2, 2, 428, 132, 3, 2, 2, 2, 429, 433, 9, 8, 2, 2, 430, 432, 9, 6, 2, 2, 431, 430, 3, 2, 2, 2, 432, 435, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 443, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 436, 438, 9, 7, 2, 2, 437, 439, 9, 6, 2, 2, 438, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 443, 3, 2, 2, 2, 442, 429, 3, 2, 2, 2, 442, 436, 3, 2, 2, 2, 443, 134, 3, 2, 2, 2, 444, 445, 7, 49, 2, 2, 445, 446, 7, 49, 2, 2, 446, 447, 7, 49, 2, 2, 447, 451, 3, 2, 2, 2, 448, 450, 11, 2, 2, 2, 449, 448, 3, 2, 2, 2, 450, 453, 3, 2, 2, 2, 451, 452, 3, 2, 2, 2, 451, 449, 3, 2, 2, 2, 452, 454, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 454, 455, 7, 12, 2, 2, 455, 136, 3, 2, 2, 2, 456, 457, 7, 49, 2, 2, 457, 458, 7, 49, 2, 2, 458, 462, 3, 2, 2, 2, 459, 461, 11, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 466, 7, 12, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 8, 69, 2, 2, 468, 138, 3, 2, 2, 2, 469, 470, 7, 49, 2, 2, 470, 471, 7, 44, 2, 2, 471, 475, 3, 2, 2, 2, 472, 474, 11, 2, 2, 2, 473, 472, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 476, 478, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 479, 7, 44, 2, 2, 479, 480, 7, 49, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 8, 70, 2, 2, 482, 140, 3, 2, 2, 2, 483, 485, 9, 9, 2, 2, 484, 483, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 484, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 489, 8, 71, 2, 2, 489, 142, 3, 2, 2, 2, 20, 2, 304, 318, 325, 327, 337, 339, 342, 418, 425, 427, 433, 440, 442, 451, 462, 475, 486, 3, 8, 2, 2] \ No newline at end of file diff --git a/quint/src/generated/QuintLexer.tokens b/quint/src/generated/QuintLexer.tokens index 427758cd2..1d1d2dd5d 100644 --- a/quint/src/generated/QuintLexer.tokens +++ b/quint/src/generated/QuintLexer.tokens @@ -44,29 +44,30 @@ AND=43 OR=44 IFF=45 IMPLIES=46 -SET=47 -LIST=48 -MAP=49 -MATCH=50 -PLUS=51 -MINUS=52 -MUL=53 -DIV=54 -MOD=55 -GT=56 -LT=57 -GE=58 -LE=59 -NE=60 -EQ=61 -ASGN=62 -LPAREN=63 -RPAREN=64 -IDENTIFIER=65 -DOCCOMMENT=66 -LINE_COMMENT=67 -COMMENT=68 -WS=69 +MAP=47 +MATCH=48 +PLUS=49 +MINUS=50 +MUL=51 +DIV=52 +MOD=53 +GT=54 +LT=55 +GE=56 +LE=57 +NE=58 +EQ=59 +ASGN=60 +LPAREN=61 +RPAREN=62 +SET=63 +LIST=64 +LOW_ID=65 +CAP_ID=66 +DOCCOMMENT=67 +LINE_COMMENT=68 +COMMENT=69 +WS=70 'module'=1 '{'=2 '}'=3 @@ -77,23 +78,23 @@ WS=69 ','=8 ';'=9 'type'=10 -'|'=11 -'nondet'=12 -'val'=13 -'def'=14 -'pure'=15 -'action'=16 -'run'=17 -'temporal'=18 -'import'=19 -'.'=20 -'from'=21 -'as'=22 -'export'=23 -'->'=24 -'=>'=25 -'['=26 -']'=27 +'['=11 +']'=12 +'|'=13 +'val'=14 +'def'=15 +'pure'=16 +'action'=17 +'run'=18 +'temporal'=19 +'nondet'=20 +'import'=21 +'.'=22 +'from'=23 +'as'=24 +'export'=25 +'->'=26 +'=>'=27 'int'=28 'str'=29 'bool'=30 @@ -110,21 +111,21 @@ WS=69 'or'=44 'iff'=45 'implies'=46 -'Set'=47 -'List'=48 -'Map'=49 -'match'=50 -'+'=51 -'-'=52 -'*'=53 -'/'=54 -'%'=55 -'>'=56 -'<'=57 -'>='=58 -'<='=59 -'!='=60 -'=='=61 -'='=62 -'('=63 -')'=64 +'Map'=47 +'match'=48 +'+'=49 +'-'=50 +'*'=51 +'/'=52 +'%'=53 +'>'=54 +'<'=55 +'>='=56 +'<='=57 +'!='=58 +'=='=59 +'='=60 +'('=61 +')'=62 +'Set'=63 +'List'=64 diff --git a/quint/src/generated/QuintLexer.ts b/quint/src/generated/QuintLexer.ts index 96e3056d4..dc195ec27 100644 --- a/quint/src/generated/QuintLexer.ts +++ b/quint/src/generated/QuintLexer.ts @@ -68,29 +68,30 @@ export class QuintLexer extends Lexer { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; - public static readonly IDENTIFIER = 65; - public static readonly DOCCOMMENT = 66; - public static readonly LINE_COMMENT = 67; - public static readonly COMMENT = 68; - public static readonly WS = 69; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; + public static readonly LOW_ID = 65; + public static readonly CAP_ID = 66; + public static readonly DOCCOMMENT = 67; + public static readonly LINE_COMMENT = 68; + public static readonly COMMENT = 69; + public static readonly WS = 70; // tslint:disable:no-trailing-whitespace public static readonly channelNames: string[] = [ @@ -108,21 +109,21 @@ export class QuintLexer extends Lexer { "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", - "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", - "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", - "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", - undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", - "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'nondet'", "'import'", "'.'", "'from'", + "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", + "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, + undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -131,10 +132,10 @@ export class QuintLexer extends Lexer { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintLexer._LITERAL_NAMES, QuintLexer._SYMBOLIC_NAMES, []); @@ -167,7 +168,7 @@ export class QuintLexer extends Lexer { public get modeNames(): string[] { return QuintLexer.modeNames; } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02G\u01D9\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02H\u01EA\b\x01" + "\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06" + "\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r" + "\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t" + @@ -178,209 +179,220 @@ export class QuintLexer extends Lexer { "+\t+\x04,\t,\x04-\t-\x04.\t.\x04/\t/\x040\t0\x041\t1\x042\t2\x043\t3\x04" + "4\t4\x045\t5\x046\t6\x047\t7\x048\t8\x049\t9\x04:\t:\x04;\t;\x04<\t<\x04" + "=\t=\x04>\t>\x04?\t?\x04@\t@\x04A\tA\x04B\tB\x04C\tC\x04D\tD\x04E\tE\x04" + - "F\tF\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03" + - "\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03\b\x03" + - "\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + - "\f\x03\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\x0E\x03\x0E\x03" + - "\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x10\x03" + - "\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03\x11\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x17\x03\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03" + - "\x18\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B\x03" + - "\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 \x03 \x03!\x03!\x03\"" + - "\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$\x03$\x03%\x03%\x03%\x03" + - "%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(\x03(\x03(\x03)\x03)\x07" + - ")\u012D\n)\f)\x0E)\u0130\v)\x03)\x03)\x03*\x03*\x03*\x03*\x03*\x03*\x03" + - "*\x03*\x03*\x05*\u013D\n*\x03+\x03+\x03+\x03+\x03+\x07+\u0144\n+\f+\x0E" + - "+\u0147\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03+\x07+\u0150\n+\f+\x0E+\u0153" + - "\v+\x05+\u0155\n+\x03,\x03,\x03,\x03,\x03-\x03-\x03-\x03.\x03.\x03.\x03" + - ".\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x030\x030\x030\x030\x031\x03" + - "1\x031\x031\x031\x032\x032\x032\x032\x033\x033\x033\x033\x033\x033\x03" + - "4\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x03:\x03:\x03" + - ";\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03=\x03>\x03>\x03>\x03?\x03?\x03" + - "@\x03@\x03A\x03A\x03B\x03B\x07B\u019F\nB\fB\x0EB\u01A2\vB\x03B\x03B\x06" + - "B\u01A6\nB\rB\x0EB\u01A7\x05B\u01AA\nB\x03C\x03C\x03C\x03C\x03C\x07C\u01B1" + - "\nC\fC\x0EC\u01B4\vC\x03C\x03C\x03D\x03D\x03D\x03D\x07D\u01BC\nD\fD\x0E" + - "D\u01BF\vD\x03D\x03D\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01C9\nE\fE\x0E" + - "E\u01CC\vE\x03E\x03E\x03E\x03E\x03E\x03F\x06F\u01D4\nF\rF\x0EF\u01D5\x03" + - "F\x03F\x06\u012E\u01B2\u01BD\u01CA\x02\x02G\x03\x02\x03\x05\x02\x04\x07" + - "\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15" + - "\x02\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02" + - "\x12#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191" + - "\x02\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02" + - "\"C\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-" + - "Y\x02.[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x02" + - "9q\x02:s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02" + - "C\x85\x02D\x87\x02E\x89\x02F\x8B\x02G\x03\x02\t\x03\x023;\x03\x022;\x05" + - "\x022;CHch\x04\x02C\\c|\x06\x022;C\\aac|\x03\x02aa\x05\x02\v\f\x0F\x0F" + - "\"\"\x02\u01E7\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07" + - "\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03" + - "\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03" + - "\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03" + - "\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02\x1F\x03" + - "\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02\x02" + - "\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02\x02" + - "-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x023\x03\x02" + - "\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02\x02\x02" + - "\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02\x02A\x03" + - "\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03\x02\x02" + - "\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02\x02\x02" + - "O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02U\x03\x02" + - "\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02\x02\x02" + - "\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02\x02c\x03" + - "\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03\x02\x02" + - "\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02\x02\x02" + - "q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02w\x03\x02" + - "\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02\x02\x02" + - "\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02\x02\x02" + - "\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02\x02\x02" + - "\x02\x8B\x03\x02\x02\x02\x03\x8D\x03\x02\x02\x02\x05\x94\x03\x02\x02\x02" + - "\x07\x96\x03\x02\x02\x02\t\x98\x03\x02\x02\x02\v\x9E\x03\x02\x02\x02\r" + - "\xA0\x03\x02\x02\x02\x0F\xA4\x03\x02\x02\x02\x11\xAB\x03\x02\x02\x02\x13" + - "\xAD\x03\x02\x02\x02\x15\xAF\x03\x02\x02\x02\x17\xB4\x03\x02\x02\x02\x19" + - "\xB6\x03\x02\x02\x02\x1B\xBD\x03\x02\x02\x02\x1D\xC1\x03\x02\x02\x02\x1F" + - "\xC5\x03\x02\x02\x02!\xCA\x03\x02\x02\x02#\xD1\x03\x02\x02\x02%\xD5\x03" + - "\x02\x02\x02\'\xDE\x03\x02\x02\x02)\xE5\x03\x02\x02\x02+\xE7\x03\x02\x02" + - "\x02-\xEC\x03\x02\x02\x02/\xEF\x03\x02\x02\x021\xF6\x03\x02\x02\x023\xF9" + - "\x03\x02\x02\x025\xFC\x03\x02\x02\x027\xFE\x03\x02\x02\x029\u0100\x03" + - "\x02\x02\x02;\u0104\x03\x02\x02\x02=\u0108\x03\x02\x02\x02?\u010D\x03" + - "\x02\x02\x02A\u010F\x03\x02\x02\x02C\u0111\x03\x02\x02\x02E\u0115\x03" + - "\x02\x02\x02G\u0119\x03\x02\x02\x02I\u011C\x03\x02\x02\x02K\u0121\x03" + - "\x02\x02\x02M\u0123\x03\x02\x02\x02O\u0127\x03\x02\x02\x02Q\u012A\x03" + - "\x02\x02\x02S\u013C\x03\x02\x02\x02U\u0154\x03\x02\x02\x02W\u0156\x03" + - "\x02\x02\x02Y\u015A\x03\x02\x02\x02[\u015D\x03\x02\x02\x02]\u0161\x03" + - "\x02\x02\x02_\u0169\x03\x02\x02\x02a\u016D\x03\x02\x02\x02c\u0172\x03" + - "\x02\x02\x02e\u0176\x03\x02\x02\x02g\u017C\x03\x02\x02\x02i\u017E\x03" + - "\x02\x02\x02k\u0180\x03\x02\x02\x02m\u0182\x03\x02\x02\x02o\u0184\x03" + - "\x02\x02\x02q\u0186\x03\x02\x02\x02s\u0188\x03\x02\x02\x02u\u018A\x03" + - "\x02\x02\x02w\u018D\x03\x02\x02\x02y\u0190\x03\x02\x02\x02{\u0193\x03" + - "\x02\x02\x02}\u0196\x03\x02\x02\x02\x7F\u0198\x03\x02\x02\x02\x81\u019A" + - "\x03\x02\x02\x02\x83\u01A9\x03\x02\x02\x02\x85\u01AB\x03\x02\x02\x02\x87" + - "\u01B7\x03\x02\x02\x02\x89\u01C4\x03\x02\x02\x02\x8B\u01D3\x03\x02\x02" + - "\x02\x8D\x8E\x07o\x02\x02\x8E\x8F\x07q\x02\x02\x8F\x90\x07f\x02\x02\x90" + - "\x91\x07w\x02\x02\x91\x92\x07n\x02\x02\x92\x93\x07g\x02\x02\x93\x04\x03" + - "\x02\x02\x02\x94\x95\x07}\x02\x02\x95\x06\x03\x02\x02\x02\x96\x97\x07" + - "\x7F\x02\x02\x97\b\x03\x02\x02\x02\x98\x99\x07e\x02\x02\x99\x9A\x07q\x02" + - "\x02\x9A\x9B\x07p\x02\x02\x9B\x9C\x07u\x02\x02\x9C\x9D\x07v\x02\x02\x9D" + - "\n\x03\x02\x02\x02\x9E\x9F\x07<\x02\x02\x9F\f\x03\x02\x02\x02\xA0\xA1" + - "\x07x\x02\x02\xA1\xA2\x07c\x02\x02\xA2\xA3\x07t\x02\x02\xA3\x0E\x03\x02" + - "\x02\x02\xA4\xA5\x07c\x02\x02\xA5\xA6\x07u\x02\x02\xA6\xA7\x07u\x02\x02" + - "\xA7\xA8\x07w\x02\x02\xA8\xA9\x07o\x02\x02\xA9\xAA\x07g\x02\x02\xAA\x10" + - "\x03\x02\x02\x02\xAB\xAC\x07.\x02\x02\xAC\x12\x03\x02\x02\x02\xAD\xAE" + - "\x07=\x02\x02\xAE\x14\x03\x02\x02\x02\xAF\xB0\x07v\x02\x02\xB0\xB1\x07" + - "{\x02\x02\xB1\xB2\x07r\x02\x02\xB2\xB3\x07g\x02\x02\xB3\x16\x03\x02\x02" + - "\x02\xB4\xB5\x07~\x02\x02\xB5\x18\x03\x02\x02\x02\xB6\xB7\x07p\x02\x02" + - "\xB7\xB8\x07q\x02\x02\xB8\xB9\x07p\x02\x02\xB9\xBA\x07f\x02\x02\xBA\xBB" + - "\x07g\x02\x02\xBB\xBC\x07v\x02\x02\xBC\x1A\x03\x02\x02\x02\xBD\xBE\x07" + - "x\x02\x02\xBE\xBF\x07c\x02\x02\xBF\xC0\x07n\x02\x02\xC0\x1C\x03\x02\x02" + - "\x02\xC1\xC2\x07f\x02\x02\xC2\xC3\x07g\x02\x02\xC3\xC4\x07h\x02\x02\xC4" + - "\x1E\x03\x02\x02\x02\xC5\xC6\x07r\x02\x02\xC6\xC7\x07w\x02\x02\xC7\xC8" + - "\x07t\x02\x02\xC8\xC9\x07g\x02\x02\xC9 \x03\x02\x02\x02\xCA\xCB\x07c\x02" + - "\x02\xCB\xCC\x07e\x02\x02\xCC\xCD\x07v\x02\x02\xCD\xCE\x07k\x02\x02\xCE" + - "\xCF\x07q\x02\x02\xCF\xD0\x07p\x02\x02\xD0\"\x03\x02\x02\x02\xD1\xD2\x07" + - "t\x02\x02\xD2\xD3\x07w\x02\x02\xD3\xD4\x07p\x02\x02\xD4$\x03\x02\x02\x02" + - "\xD5\xD6\x07v\x02\x02\xD6\xD7\x07g\x02\x02\xD7\xD8\x07o\x02\x02\xD8\xD9" + - "\x07r\x02\x02\xD9\xDA\x07q\x02\x02\xDA\xDB\x07t\x02\x02\xDB\xDC\x07c\x02" + - "\x02\xDC\xDD\x07n\x02\x02\xDD&\x03\x02\x02\x02\xDE\xDF\x07k\x02\x02\xDF" + - "\xE0\x07o\x02\x02\xE0\xE1\x07r\x02\x02\xE1\xE2\x07q\x02\x02\xE2\xE3\x07" + - "t\x02\x02\xE3\xE4\x07v\x02\x02\xE4(\x03\x02\x02\x02\xE5\xE6\x070\x02\x02" + - "\xE6*\x03\x02\x02\x02\xE7\xE8\x07h\x02\x02\xE8\xE9\x07t\x02\x02\xE9\xEA" + - "\x07q\x02\x02\xEA\xEB\x07o\x02\x02\xEB,\x03\x02\x02\x02\xEC\xED\x07c\x02" + - "\x02\xED\xEE\x07u\x02\x02\xEE.\x03\x02\x02\x02\xEF\xF0\x07g\x02\x02\xF0" + - "\xF1\x07z\x02\x02\xF1\xF2\x07r\x02\x02\xF2\xF3\x07q\x02\x02\xF3\xF4\x07" + - "t\x02\x02\xF4\xF5\x07v\x02\x02\xF50\x03\x02\x02\x02\xF6\xF7\x07/\x02\x02" + - "\xF7\xF8\x07@\x02\x02\xF82\x03\x02\x02\x02\xF9\xFA\x07?\x02\x02\xFA\xFB" + - "\x07@\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07]\x02\x02\xFD6\x03\x02\x02" + - "\x02\xFE\xFF\x07_\x02\x02\xFF8\x03\x02\x02\x02\u0100\u0101\x07k\x02\x02" + - "\u0101\u0102\x07p\x02\x02\u0102\u0103\x07v\x02\x02\u0103:\x03\x02\x02" + - "\x02\u0104\u0105\x07u\x02\x02\u0105\u0106\x07v\x02\x02\u0106\u0107\x07" + - "t\x02\x02\u0107<\x03\x02\x02\x02\u0108\u0109\x07d\x02\x02\u0109\u010A" + - "\x07q\x02\x02\u010A\u010B\x07q\x02\x02\u010B\u010C\x07n\x02\x02\u010C" + - ">\x03\x02\x02\x02\u010D\u010E\x07`\x02\x02\u010E@\x03\x02\x02\x02\u010F" + - "\u0110\x07)\x02\x02\u0110B\x03\x02\x02\x02\u0111\u0112\x07c\x02\x02\u0112" + - "\u0113\x07n\x02\x02\u0113\u0114\x07n\x02\x02\u0114D\x03\x02\x02\x02\u0115" + - "\u0116\x07c\x02\x02\u0116\u0117\x07p\x02\x02\u0117\u0118\x07{\x02\x02" + - "\u0118F\x03\x02\x02\x02\u0119\u011A\x07k\x02\x02\u011A\u011B\x07h\x02" + - "\x02\u011BH\x03\x02\x02\x02\u011C\u011D\x07g\x02\x02\u011D\u011E\x07n" + - "\x02\x02\u011E\u011F\x07u\x02\x02\u011F\u0120\x07g\x02\x02\u0120J\x03" + - "\x02\x02\x02\u0121\u0122\x07a\x02\x02\u0122L\x03\x02\x02\x02\u0123\u0124" + - "\x070\x02\x02\u0124\u0125\x070\x02\x02\u0125\u0126\x070\x02\x02\u0126" + - "N\x03\x02\x02\x02\u0127\u0128\x07<\x02\x02\u0128\u0129\x07<\x02\x02\u0129" + - "P\x03\x02\x02\x02\u012A\u012E\x07$\x02\x02\u012B\u012D\v\x02\x02\x02\u012C" + - "\u012B\x03\x02\x02\x02\u012D\u0130\x03\x02\x02\x02\u012E\u012F\x03\x02" + - "\x02\x02\u012E\u012C\x03\x02\x02\x02\u012F\u0131\x03\x02\x02\x02\u0130" + - "\u012E\x03\x02\x02\x02\u0131\u0132\x07$\x02\x02\u0132R\x03\x02\x02\x02" + - "\u0133\u0134\x07h\x02\x02\u0134\u0135\x07c\x02\x02\u0135\u0136\x07n\x02" + - "\x02\u0136\u0137\x07u\x02\x02\u0137\u013D\x07g\x02\x02\u0138\u0139\x07" + - "v\x02\x02\u0139\u013A\x07t\x02\x02\u013A\u013B\x07w\x02\x02\u013B\u013D" + - "\x07g\x02\x02\u013C\u0133\x03\x02\x02\x02\u013C\u0138\x03\x02\x02\x02" + - "\u013DT\x03\x02\x02\x02\u013E\u0155\x072\x02\x02\u013F\u0145\t\x02\x02" + - "\x02\u0140\u0144\t\x03\x02\x02\u0141\u0142\x07a\x02\x02\u0142\u0144\t" + - "\x03\x02\x02\u0143\u0140\x03\x02\x02\x02\u0143\u0141\x03\x02\x02\x02\u0144" + - "\u0147\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0145\u0146\x03\x02" + - "\x02\x02\u0146\u0155\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0148" + - "\u0149\x072\x02\x02\u0149\u014A\x07z\x02\x02\u014A\u014B\x03\x02\x02\x02" + - "\u014B\u0151\t\x04\x02\x02\u014C\u0150\t\x04\x02\x02\u014D\u014E\x07a" + - "\x02\x02\u014E\u0150\t\x04\x02\x02\u014F\u014C\x03\x02\x02\x02\u014F\u014D" + - "\x03\x02\x02\x02\u0150\u0153\x03\x02\x02\x02\u0151\u014F\x03\x02\x02\x02" + - "\u0151\u0152\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03" + - "\x02\x02\x02\u0154\u013E\x03\x02\x02\x02\u0154\u013F\x03\x02\x02\x02\u0154" + - "\u0148\x03\x02\x02\x02\u0155V\x03\x02\x02\x02\u0156\u0157\x07c\x02\x02" + - "\u0157\u0158\x07p\x02\x02\u0158\u0159\x07f\x02\x02\u0159X\x03\x02\x02" + - "\x02\u015A\u015B\x07q\x02\x02\u015B\u015C\x07t\x02\x02\u015CZ\x03\x02" + - "\x02\x02\u015D\u015E\x07k\x02\x02\u015E\u015F\x07h\x02\x02\u015F\u0160" + - "\x07h\x02\x02\u0160\\\x03\x02\x02\x02\u0161\u0162\x07k\x02\x02\u0162\u0163" + - "\x07o\x02\x02\u0163\u0164\x07r\x02\x02\u0164\u0165\x07n\x02\x02\u0165" + - "\u0166\x07k\x02\x02\u0166\u0167\x07g\x02\x02\u0167\u0168\x07u\x02\x02" + - "\u0168^\x03\x02\x02\x02\u0169\u016A\x07U\x02\x02\u016A\u016B\x07g\x02" + - "\x02\u016B\u016C\x07v\x02\x02\u016C`\x03\x02\x02\x02\u016D\u016E\x07N" + - "\x02\x02\u016E\u016F\x07k\x02\x02\u016F\u0170\x07u\x02\x02\u0170\u0171" + - "\x07v\x02\x02\u0171b\x03\x02\x02\x02\u0172\u0173\x07O\x02\x02\u0173\u0174" + - "\x07c\x02\x02\u0174\u0175\x07r\x02\x02\u0175d\x03\x02\x02\x02\u0176\u0177" + - "\x07o\x02\x02\u0177\u0178\x07c\x02\x02\u0178\u0179\x07v\x02\x02\u0179" + - "\u017A\x07e\x02\x02\u017A\u017B\x07j\x02\x02\u017Bf\x03\x02\x02\x02\u017C" + - "\u017D\x07-\x02\x02\u017Dh\x03\x02\x02\x02\u017E\u017F\x07/\x02\x02\u017F" + - "j\x03\x02\x02\x02\u0180\u0181\x07,\x02\x02\u0181l\x03\x02\x02\x02\u0182" + - "\u0183\x071\x02\x02\u0183n\x03\x02\x02\x02\u0184\u0185\x07\'\x02\x02\u0185" + - "p\x03\x02\x02\x02\u0186\u0187\x07@\x02\x02\u0187r\x03\x02\x02\x02\u0188" + - "\u0189\x07>\x02\x02\u0189t\x03\x02\x02\x02\u018A\u018B\x07@\x02\x02\u018B" + - "\u018C\x07?\x02\x02\u018Cv\x03\x02\x02\x02\u018D\u018E\x07>\x02\x02\u018E" + - "\u018F\x07?\x02\x02\u018Fx\x03\x02\x02\x02\u0190\u0191\x07#\x02\x02\u0191" + - "\u0192\x07?\x02\x02\u0192z\x03\x02\x02\x02\u0193\u0194\x07?\x02\x02\u0194" + - "\u0195\x07?\x02\x02\u0195|\x03\x02\x02\x02\u0196\u0197\x07?\x02\x02\u0197" + - "~\x03\x02\x02\x02\u0198\u0199\x07*\x02\x02\u0199\x80\x03\x02\x02\x02\u019A" + - "\u019B\x07+\x02\x02\u019B\x82\x03\x02\x02\x02\u019C\u01A0\t\x05\x02\x02" + - "\u019D\u019F\t\x06\x02\x02\u019E\u019D\x03\x02\x02\x02\u019F\u01A2\x03" + - "\x02\x02\x02\u01A0\u019E\x03\x02\x02\x02\u01A0\u01A1\x03\x02\x02\x02\u01A1" + - "\u01AA\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A3\u01A5\t\x07\x02" + - "\x02\u01A4\u01A6\t\x06\x02\x02\u01A5\u01A4\x03\x02\x02\x02\u01A6\u01A7" + - "\x03\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7\u01A8\x03\x02\x02\x02" + - "\u01A8\u01AA\x03\x02\x02\x02\u01A9\u019C\x03\x02\x02\x02\u01A9\u01A3\x03" + - "\x02\x02\x02\u01AA\x84\x03\x02\x02\x02\u01AB\u01AC\x071\x02\x02\u01AC" + - "\u01AD\x071\x02\x02\u01AD\u01AE\x071\x02\x02\u01AE\u01B2\x03\x02\x02\x02" + - "\u01AF\u01B1\v\x02\x02\x02\u01B0\u01AF\x03\x02\x02\x02\u01B1\u01B4\x03" + - "\x02\x02\x02\u01B2\u01B3\x03\x02\x02\x02\u01B2\u01B0\x03\x02\x02\x02\u01B3" + - "\u01B5\x03\x02\x02\x02\u01B4\u01B2\x03\x02\x02\x02\u01B5\u01B6\x07\f\x02" + - "\x02\u01B6\x86\x03\x02\x02\x02\u01B7\u01B8\x071\x02\x02\u01B8\u01B9\x07" + - "1\x02\x02\u01B9\u01BD\x03\x02\x02\x02\u01BA\u01BC\v\x02\x02\x02\u01BB" + - "\u01BA\x03\x02\x02\x02\u01BC\u01BF\x03\x02\x02\x02\u01BD\u01BE\x03\x02" + - "\x02\x02\u01BD\u01BB\x03\x02\x02\x02\u01BE\u01C0\x03\x02\x02\x02\u01BF" + - "\u01BD\x03\x02\x02\x02\u01C0\u01C1\x07\f\x02\x02\u01C1\u01C2\x03\x02\x02" + - "\x02\u01C2\u01C3\bD\x02\x02\u01C3\x88\x03\x02\x02\x02\u01C4\u01C5\x07" + - "1\x02\x02\u01C5\u01C6\x07,\x02\x02\u01C6\u01CA\x03\x02\x02\x02\u01C7\u01C9" + - "\v\x02\x02\x02\u01C8\u01C7\x03\x02\x02\x02\u01C9\u01CC\x03\x02\x02\x02" + - "\u01CA\u01CB\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB\u01CD\x03" + - "\x02\x02\x02\u01CC\u01CA\x03\x02\x02\x02\u01CD\u01CE\x07,\x02\x02\u01CE" + - "\u01CF\x071\x02\x02\u01CF\u01D0\x03\x02\x02\x02\u01D0\u01D1\bE\x02\x02" + - "\u01D1\x8A\x03\x02\x02\x02\u01D2\u01D4\t\b\x02\x02\u01D3\u01D2\x03\x02" + - "\x02\x02\u01D4\u01D5\x03\x02\x02\x02\u01D5\u01D3\x03\x02\x02\x02\u01D5" + - "\u01D6\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01D8\bF\x02" + - "\x02\u01D8\x8C\x03\x02\x02\x02\x11\x02\u012E\u013C\u0143\u0145\u014F\u0151" + - "\u0154\u01A0\u01A7\u01A9\u01B2\u01BD\u01CA\u01D5\x03\b\x02\x02"; + "F\tF\x04G\tG\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + + "\x03\x03\x03\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x06\x03\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\b\x03\b\x03\b" + + "\x03\b\x03\b\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\v\x03" + + "\v\x03\v\x03\f\x03\f\x03\r\x03\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F" + + "\x03\x0F\x03\x10\x03\x10\x03\x10\x03\x10\x03\x11\x03\x11\x03\x11\x03\x11" + + "\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x17" + + "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19" + + "\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1B\x03\x1B" + + "\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03 " + + "\x03 \x03!\x03!\x03\"\x03\"\x03\"\x03\"\x03#\x03#\x03#\x03#\x03$\x03$" + + "\x03$\x03%\x03%\x03%\x03%\x03%\x03&\x03&\x03\'\x03\'\x03\'\x03\'\x03(" + + "\x03(\x03(\x03)\x03)\x07)\u012F\n)\f)\x0E)\u0132\v)\x03)\x03)\x03*\x03" + + "*\x03*\x03*\x03*\x03*\x03*\x03*\x03*\x05*\u013F\n*\x03+\x03+\x03+\x03" + + "+\x03+\x07+\u0146\n+\f+\x0E+\u0149\v+\x03+\x03+\x03+\x03+\x03+\x03+\x03" + + "+\x07+\u0152\n+\f+\x0E+\u0155\v+\x05+\u0157\n+\x03,\x03,\x03,\x03,\x03" + + "-\x03-\x03-\x03.\x03.\x03.\x03.\x03/\x03/\x03/\x03/\x03/\x03/\x03/\x03" + + "/\x030\x030\x030\x030\x031\x031\x031\x031\x031\x031\x032\x032\x033\x03" + + "3\x034\x034\x035\x035\x036\x036\x037\x037\x038\x038\x039\x039\x039\x03" + + ":\x03:\x03:\x03;\x03;\x03;\x03<\x03<\x03<\x03=\x03=\x03>\x03>\x03?\x03" + + "?\x03@\x03@\x03@\x03@\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x07B\u01A1\n" + + "B\fB\x0EB\u01A4\vB\x03B\x03B\x06B\u01A8\nB\rB\x0EB\u01A9\x05B\u01AC\n" + + "B\x03C\x03C\x07C\u01B0\nC\fC\x0EC\u01B3\vC\x03C\x03C\x06C\u01B7\nC\rC" + + "\x0EC\u01B8\x05C\u01BB\nC\x03D\x03D\x03D\x03D\x03D\x07D\u01C2\nD\fD\x0E" + + "D\u01C5\vD\x03D\x03D\x03E\x03E\x03E\x03E\x07E\u01CD\nE\fE\x0EE\u01D0\v" + + "E\x03E\x03E\x03E\x03E\x03F\x03F\x03F\x03F\x07F\u01DA\nF\fF\x0EF\u01DD" + + "\vF\x03F\x03F\x03F\x03F\x03F\x03G\x06G\u01E5\nG\rG\x0EG\u01E6\x03G\x03" + + "G\x06\u0130\u01C3\u01CE\u01DB\x02\x02H\x03\x02\x03\x05\x02\x04\x07\x02" + + "\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02" + + "\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12" + + "#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02" + + "\x1A3\x02\x1B5\x02\x1C7\x02\x1D9\x02\x1E;\x02\x1F=\x02 ?\x02!A\x02\"C" + + "\x02#E\x02$G\x02%I\x02&K\x02\'M\x02(O\x02)Q\x02*S\x02+U\x02,W\x02-Y\x02" + + ".[\x02/]\x020_\x021a\x022c\x023e\x024g\x025i\x026k\x027m\x028o\x029q\x02" + + ":s\x02;u\x02{\x02?}\x02@\x7F\x02A\x81\x02B\x83\x02C\x85\x02" + + "D\x87\x02E\x89\x02F\x8B\x02G\x8D\x02H\x03\x02\n\x03\x023;\x03\x022;\x05" + + "\x022;CHch\x03\x02c|\x06\x022;C\\aac|\x03\x02aa\x03\x02C\\\x05\x02\v\f" + + "\x0F\x0F\"\"\x02\u01FB\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02" + + "\x02\x07\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02" + + "\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02" + + "\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02" + + "\x19\x03\x02\x02\x02\x02\x1B\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02" + + "\x1F\x03\x02\x02\x02\x02!\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03" + + "\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02" + + "\x02\x02-\x03\x02\x02\x02\x02/\x03\x02\x02\x02\x021\x03\x02\x02\x02\x02" + + "3\x03\x02\x02\x02\x025\x03\x02\x02\x02\x027\x03\x02\x02\x02\x029\x03\x02" + + "\x02\x02\x02;\x03\x02\x02\x02\x02=\x03\x02\x02\x02\x02?\x03\x02\x02\x02" + + "\x02A\x03\x02\x02\x02\x02C\x03\x02\x02\x02\x02E\x03\x02\x02\x02\x02G\x03" + + "\x02\x02\x02\x02I\x03\x02\x02\x02\x02K\x03\x02\x02\x02\x02M\x03\x02\x02" + + "\x02\x02O\x03\x02\x02\x02\x02Q\x03\x02\x02\x02\x02S\x03\x02\x02\x02\x02" + + "U\x03\x02\x02\x02\x02W\x03\x02\x02\x02\x02Y\x03\x02\x02\x02\x02[\x03\x02" + + "\x02\x02\x02]\x03\x02\x02\x02\x02_\x03\x02\x02\x02\x02a\x03\x02\x02\x02" + + "\x02c\x03\x02\x02\x02\x02e\x03\x02\x02\x02\x02g\x03\x02\x02\x02\x02i\x03" + + "\x02\x02\x02\x02k\x03\x02\x02\x02\x02m\x03\x02\x02\x02\x02o\x03\x02\x02" + + "\x02\x02q\x03\x02\x02\x02\x02s\x03\x02\x02\x02\x02u\x03\x02\x02\x02\x02" + + "w\x03\x02\x02\x02\x02y\x03\x02\x02\x02\x02{\x03\x02\x02\x02\x02}\x03\x02" + + "\x02\x02\x02\x7F\x03\x02\x02\x02\x02\x81\x03\x02\x02\x02\x02\x83\x03\x02" + + "\x02\x02\x02\x85\x03\x02\x02\x02\x02\x87\x03\x02\x02\x02\x02\x89\x03\x02" + + "\x02\x02\x02\x8B\x03\x02\x02\x02\x02\x8D\x03\x02\x02\x02\x03\x8F\x03\x02" + + "\x02\x02\x05\x96\x03\x02\x02\x02\x07\x98\x03\x02\x02\x02\t\x9A\x03\x02" + + "\x02\x02\v\xA0\x03\x02\x02\x02\r\xA2\x03\x02\x02\x02\x0F\xA6\x03\x02\x02" + + "\x02\x11\xAD\x03\x02\x02\x02\x13\xAF\x03\x02\x02\x02\x15\xB1\x03\x02\x02" + + "\x02\x17\xB6\x03\x02\x02\x02\x19\xB8\x03\x02\x02\x02\x1B\xBA\x03\x02\x02" + + "\x02\x1D\xBC\x03\x02\x02\x02\x1F\xC0\x03\x02\x02\x02!\xC4\x03\x02\x02" + + "\x02#\xC9\x03\x02\x02\x02%\xD0\x03\x02\x02\x02\'\xD4\x03\x02\x02\x02)" + + "\xDD\x03\x02\x02\x02+\xE4\x03\x02\x02\x02-\xEB\x03\x02\x02\x02/\xED\x03" + + "\x02\x02\x021\xF2\x03\x02\x02\x023\xF5\x03\x02\x02\x025\xFC\x03\x02\x02" + + "\x027\xFF\x03\x02\x02\x029\u0102\x03\x02\x02\x02;\u0106\x03\x02\x02\x02" + + "=\u010A\x03\x02\x02\x02?\u010F\x03\x02\x02\x02A\u0111\x03\x02\x02\x02" + + "C\u0113\x03\x02\x02\x02E\u0117\x03\x02\x02\x02G\u011B\x03\x02\x02\x02" + + "I\u011E\x03\x02\x02\x02K\u0123\x03\x02\x02\x02M\u0125\x03\x02\x02\x02" + + "O\u0129\x03\x02\x02\x02Q\u012C\x03\x02\x02\x02S\u013E\x03\x02\x02\x02" + + "U\u0156\x03\x02\x02\x02W\u0158\x03\x02\x02\x02Y\u015C\x03\x02\x02\x02" + + "[\u015F\x03\x02\x02\x02]\u0163\x03\x02\x02\x02_\u016B\x03\x02\x02\x02" + + "a\u016F\x03\x02\x02\x02c\u0175\x03\x02\x02\x02e\u0177\x03\x02\x02\x02" + + "g\u0179\x03\x02\x02\x02i\u017B\x03\x02\x02\x02k\u017D\x03\x02\x02\x02" + + "m\u017F\x03\x02\x02\x02o\u0181\x03\x02\x02\x02q\u0183\x03\x02\x02\x02" + + "s\u0186\x03\x02\x02\x02u\u0189\x03\x02\x02\x02w\u018C\x03\x02\x02\x02" + + "y\u018F\x03\x02\x02\x02{\u0191\x03\x02\x02\x02}\u0193\x03\x02\x02\x02" + + "\x7F\u0195\x03\x02\x02\x02\x81\u0199\x03\x02\x02\x02\x83\u01AB\x03\x02" + + "\x02\x02\x85\u01BA\x03\x02\x02\x02\x87\u01BC\x03\x02\x02\x02\x89\u01C8" + + "\x03\x02\x02\x02\x8B\u01D5\x03\x02\x02\x02\x8D\u01E4\x03\x02\x02\x02\x8F" + + "\x90\x07o\x02\x02\x90\x91\x07q\x02\x02\x91\x92\x07f\x02\x02\x92\x93\x07" + + "w\x02\x02\x93\x94\x07n\x02\x02\x94\x95\x07g\x02\x02\x95\x04\x03\x02\x02" + + "\x02\x96\x97\x07}\x02\x02\x97\x06\x03\x02\x02\x02\x98\x99\x07\x7F\x02" + + "\x02\x99\b\x03\x02\x02\x02\x9A\x9B\x07e\x02\x02\x9B\x9C\x07q\x02\x02\x9C" + + "\x9D\x07p\x02\x02\x9D\x9E\x07u\x02\x02\x9E\x9F\x07v\x02\x02\x9F\n\x03" + + "\x02\x02\x02\xA0\xA1\x07<\x02\x02\xA1\f\x03\x02\x02\x02\xA2\xA3\x07x\x02" + + "\x02\xA3\xA4\x07c\x02\x02\xA4\xA5\x07t\x02\x02\xA5\x0E\x03\x02\x02\x02" + + "\xA6\xA7\x07c\x02\x02\xA7\xA8\x07u\x02\x02\xA8\xA9\x07u\x02\x02\xA9\xAA" + + "\x07w\x02\x02\xAA\xAB\x07o\x02\x02\xAB\xAC\x07g\x02\x02\xAC\x10\x03\x02" + + "\x02\x02\xAD\xAE\x07.\x02\x02\xAE\x12\x03\x02\x02\x02\xAF\xB0\x07=\x02" + + "\x02\xB0\x14\x03\x02\x02\x02\xB1\xB2\x07v\x02\x02\xB2\xB3\x07{\x02\x02" + + "\xB3\xB4\x07r\x02\x02\xB4\xB5\x07g\x02\x02\xB5\x16\x03\x02\x02\x02\xB6" + + "\xB7\x07]\x02\x02\xB7\x18\x03\x02\x02\x02\xB8\xB9\x07_\x02\x02\xB9\x1A" + + "\x03\x02\x02\x02\xBA\xBB\x07~\x02\x02\xBB\x1C\x03\x02\x02\x02\xBC\xBD" + + "\x07x\x02\x02\xBD\xBE\x07c\x02\x02\xBE\xBF\x07n\x02\x02\xBF\x1E\x03\x02" + + "\x02\x02\xC0\xC1\x07f\x02\x02\xC1\xC2\x07g\x02\x02\xC2\xC3\x07h\x02\x02" + + "\xC3 \x03\x02\x02\x02\xC4\xC5\x07r\x02\x02\xC5\xC6\x07w\x02\x02\xC6\xC7" + + "\x07t\x02\x02\xC7\xC8\x07g\x02\x02\xC8\"\x03\x02\x02\x02\xC9\xCA\x07c" + + "\x02\x02\xCA\xCB\x07e\x02\x02\xCB\xCC\x07v\x02\x02\xCC\xCD\x07k\x02\x02" + + "\xCD\xCE\x07q\x02\x02\xCE\xCF\x07p\x02\x02\xCF$\x03\x02\x02\x02\xD0\xD1" + + "\x07t\x02\x02\xD1\xD2\x07w\x02\x02\xD2\xD3\x07p\x02\x02\xD3&\x03\x02\x02" + + "\x02\xD4\xD5\x07v\x02\x02\xD5\xD6\x07g\x02\x02\xD6\xD7\x07o\x02\x02\xD7" + + "\xD8\x07r\x02\x02\xD8\xD9\x07q\x02\x02\xD9\xDA\x07t\x02\x02\xDA\xDB\x07" + + "c\x02\x02\xDB\xDC\x07n\x02\x02\xDC(\x03\x02\x02\x02\xDD\xDE\x07p\x02\x02" + + "\xDE\xDF\x07q\x02\x02\xDF\xE0\x07p\x02\x02\xE0\xE1\x07f\x02\x02\xE1\xE2" + + "\x07g\x02\x02\xE2\xE3\x07v\x02\x02\xE3*\x03\x02\x02\x02\xE4\xE5\x07k\x02" + + "\x02\xE5\xE6\x07o\x02\x02\xE6\xE7\x07r\x02\x02\xE7\xE8\x07q\x02\x02\xE8" + + "\xE9\x07t\x02\x02\xE9\xEA\x07v\x02\x02\xEA,\x03\x02\x02\x02\xEB\xEC\x07" + + "0\x02\x02\xEC.\x03\x02\x02\x02\xED\xEE\x07h\x02\x02\xEE\xEF\x07t\x02\x02" + + "\xEF\xF0\x07q\x02\x02\xF0\xF1\x07o\x02\x02\xF10\x03\x02\x02\x02\xF2\xF3" + + "\x07c\x02\x02\xF3\xF4\x07u\x02\x02\xF42\x03\x02\x02\x02\xF5\xF6\x07g\x02" + + "\x02\xF6\xF7\x07z\x02\x02\xF7\xF8\x07r\x02\x02\xF8\xF9\x07q\x02\x02\xF9" + + "\xFA\x07t\x02\x02\xFA\xFB\x07v\x02\x02\xFB4\x03\x02\x02\x02\xFC\xFD\x07" + + "/\x02\x02\xFD\xFE\x07@\x02\x02\xFE6\x03\x02\x02\x02\xFF\u0100\x07?\x02" + + "\x02\u0100\u0101\x07@\x02\x02\u01018\x03\x02\x02\x02\u0102\u0103\x07k" + + "\x02\x02\u0103\u0104\x07p\x02\x02\u0104\u0105\x07v\x02\x02\u0105:\x03" + + "\x02\x02\x02\u0106\u0107\x07u\x02\x02\u0107\u0108\x07v\x02\x02\u0108\u0109" + + "\x07t\x02\x02\u0109<\x03\x02\x02\x02\u010A\u010B\x07d\x02\x02\u010B\u010C" + + "\x07q\x02\x02\u010C\u010D\x07q\x02\x02\u010D\u010E\x07n\x02\x02\u010E" + + ">\x03\x02\x02\x02\u010F\u0110\x07`\x02\x02\u0110@\x03\x02\x02\x02\u0111" + + "\u0112\x07)\x02\x02\u0112B\x03\x02\x02\x02\u0113\u0114\x07c\x02\x02\u0114" + + "\u0115\x07n\x02\x02\u0115\u0116\x07n\x02\x02\u0116D\x03\x02\x02\x02\u0117" + + "\u0118\x07c\x02\x02\u0118\u0119\x07p\x02\x02\u0119\u011A\x07{\x02\x02" + + "\u011AF\x03\x02\x02\x02\u011B\u011C\x07k\x02\x02\u011C\u011D\x07h\x02" + + "\x02\u011DH\x03\x02\x02\x02\u011E\u011F\x07g\x02\x02\u011F\u0120\x07n" + + "\x02\x02\u0120\u0121\x07u\x02\x02\u0121\u0122\x07g\x02\x02\u0122J\x03" + + "\x02\x02\x02\u0123\u0124\x07a\x02\x02\u0124L\x03\x02\x02\x02\u0125\u0126" + + "\x070\x02\x02\u0126\u0127\x070\x02\x02\u0127\u0128\x070\x02\x02\u0128" + + "N\x03\x02\x02\x02\u0129\u012A\x07<\x02\x02\u012A\u012B\x07<\x02\x02\u012B" + + "P\x03\x02\x02\x02\u012C\u0130\x07$\x02\x02\u012D\u012F\v\x02\x02\x02\u012E" + + "\u012D\x03\x02\x02\x02\u012F\u0132\x03\x02\x02\x02\u0130\u0131\x03\x02" + + "\x02\x02\u0130\u012E\x03\x02\x02\x02\u0131\u0133\x03\x02\x02\x02\u0132" + + "\u0130\x03\x02\x02\x02\u0133\u0134\x07$\x02\x02\u0134R\x03\x02\x02\x02" + + "\u0135\u0136\x07h\x02\x02\u0136\u0137\x07c\x02\x02\u0137\u0138\x07n\x02" + + "\x02\u0138\u0139\x07u\x02\x02\u0139\u013F\x07g\x02\x02\u013A\u013B\x07" + + "v\x02\x02\u013B\u013C\x07t\x02\x02\u013C\u013D\x07w\x02\x02\u013D\u013F" + + "\x07g\x02\x02\u013E\u0135\x03\x02\x02\x02\u013E\u013A\x03\x02\x02\x02" + + "\u013FT\x03\x02\x02\x02\u0140\u0157\x072\x02\x02\u0141\u0147\t\x02\x02" + + "\x02\u0142\u0146\t\x03\x02\x02\u0143\u0144\x07a\x02\x02\u0144\u0146\t" + + "\x03\x02\x02\u0145\u0142\x03\x02\x02\x02\u0145\u0143\x03\x02\x02\x02\u0146" + + "\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148\x03\x02" + + "\x02\x02\u0148\u0157\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02\u014A" + + "\u014B\x072\x02\x02\u014B\u014C\x07z\x02\x02\u014C\u014D\x03\x02\x02\x02" + + "\u014D\u0153\t\x04\x02\x02\u014E\u0152\t\x04\x02\x02\u014F\u0150\x07a" + + "\x02\x02\u0150\u0152\t\x04\x02\x02\u0151\u014E\x03\x02\x02\x02\u0151\u014F" + + "\x03\x02\x02\x02\u0152\u0155\x03\x02\x02\x02\u0153\u0151\x03\x02\x02\x02" + + "\u0153\u0154\x03\x02\x02\x02\u0154\u0157\x03\x02\x02\x02\u0155\u0153\x03" + + "\x02\x02\x02\u0156\u0140\x03\x02\x02\x02\u0156\u0141\x03\x02\x02\x02\u0156" + + "\u014A\x03\x02\x02\x02\u0157V\x03\x02\x02\x02\u0158\u0159\x07c\x02\x02" + + "\u0159\u015A\x07p\x02\x02\u015A\u015B\x07f\x02\x02\u015BX\x03\x02\x02" + + "\x02\u015C\u015D\x07q\x02\x02\u015D\u015E\x07t\x02\x02\u015EZ\x03\x02" + + "\x02\x02\u015F\u0160\x07k\x02\x02\u0160\u0161\x07h\x02\x02\u0161\u0162" + + "\x07h\x02\x02\u0162\\\x03\x02\x02\x02\u0163\u0164\x07k\x02\x02\u0164\u0165" + + "\x07o\x02\x02\u0165\u0166\x07r\x02\x02\u0166\u0167\x07n\x02\x02\u0167" + + "\u0168\x07k\x02\x02\u0168\u0169\x07g\x02\x02\u0169\u016A\x07u\x02\x02" + + "\u016A^\x03\x02\x02\x02\u016B\u016C\x07O\x02\x02\u016C\u016D\x07c\x02" + + "\x02\u016D\u016E\x07r\x02\x02\u016E`\x03\x02\x02\x02\u016F\u0170\x07o" + + "\x02\x02\u0170\u0171\x07c\x02\x02\u0171\u0172\x07v\x02\x02\u0172\u0173" + + "\x07e\x02\x02\u0173\u0174\x07j\x02\x02\u0174b\x03\x02\x02\x02\u0175\u0176" + + "\x07-\x02\x02\u0176d\x03\x02\x02\x02\u0177\u0178\x07/\x02\x02\u0178f\x03" + + "\x02\x02\x02\u0179\u017A\x07,\x02\x02\u017Ah\x03\x02\x02\x02\u017B\u017C" + + "\x071\x02\x02\u017Cj\x03\x02\x02\x02\u017D\u017E\x07\'\x02\x02\u017El" + + "\x03\x02\x02\x02\u017F\u0180\x07@\x02\x02\u0180n\x03\x02\x02\x02\u0181" + + "\u0182\x07>\x02\x02\u0182p\x03\x02\x02\x02\u0183\u0184\x07@\x02\x02\u0184" + + "\u0185\x07?\x02\x02\u0185r\x03\x02\x02\x02\u0186\u0187\x07>\x02\x02\u0187" + + "\u0188\x07?\x02\x02\u0188t\x03\x02\x02\x02\u0189\u018A\x07#\x02\x02\u018A" + + "\u018B\x07?\x02\x02\u018Bv\x03\x02\x02\x02\u018C\u018D\x07?\x02\x02\u018D" + + "\u018E\x07?\x02\x02\u018Ex\x03\x02\x02\x02\u018F\u0190\x07?\x02\x02\u0190" + + "z\x03\x02\x02\x02\u0191\u0192\x07*\x02\x02\u0192|\x03\x02\x02\x02\u0193" + + "\u0194\x07+\x02\x02\u0194~\x03\x02\x02\x02\u0195\u0196\x07U\x02\x02\u0196" + + "\u0197\x07g\x02\x02\u0197\u0198\x07v\x02\x02\u0198\x80\x03\x02\x02\x02" + + "\u0199\u019A\x07N\x02\x02\u019A\u019B\x07k\x02\x02\u019B\u019C\x07u\x02" + + "\x02\u019C\u019D\x07v\x02\x02\u019D\x82\x03\x02\x02\x02\u019E\u01A2\t" + + "\x05\x02\x02\u019F\u01A1\t\x06\x02\x02\u01A0\u019F\x03\x02\x02\x02\u01A1" + + "\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3\x03\x02" + + "\x02\x02\u01A3\u01AC\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A7\t\x07\x02\x02\u01A6\u01A8\t\x06\x02\x02\u01A7\u01A6\x03\x02\x02" + + "\x02\u01A8\u01A9\x03\x02\x02\x02\u01A9\u01A7\x03\x02\x02\x02\u01A9\u01AA" + + "\x03\x02\x02\x02\u01AA\u01AC\x03\x02\x02\x02\u01AB\u019E\x03\x02\x02\x02" + + "\u01AB\u01A5\x03\x02\x02\x02\u01AC\x84\x03\x02\x02\x02\u01AD\u01B1\t\b" + + "\x02\x02\u01AE\u01B0\t\x06\x02\x02\u01AF\u01AE\x03\x02\x02\x02\u01B0\u01B3" + + "\x03\x02\x02\x02\u01B1\u01AF\x03\x02\x02\x02\u01B1\u01B2\x03\x02\x02\x02" + + "\u01B2\u01BB\x03\x02\x02\x02\u01B3\u01B1\x03\x02\x02\x02\u01B4\u01B6\t" + + "\x07\x02\x02\u01B5\u01B7\t\x06\x02\x02\u01B6\u01B5\x03\x02\x02\x02\u01B7" + + "\u01B8\x03\x02\x02\x02\u01B8\u01B6\x03\x02\x02\x02\u01B8\u01B9\x03\x02" + + "\x02\x02\u01B9\u01BB\x03\x02\x02\x02\u01BA\u01AD\x03\x02\x02\x02\u01BA" + + "\u01B4\x03\x02\x02\x02\u01BB\x86\x03\x02\x02\x02\u01BC\u01BD\x071\x02" + + "\x02\u01BD\u01BE\x071\x02\x02\u01BE\u01BF\x071\x02\x02\u01BF\u01C3\x03" + + "\x02\x02\x02\u01C0\u01C2\v\x02\x02\x02\u01C1\u01C0\x03\x02\x02\x02\u01C2" + + "\u01C5\x03\x02\x02\x02\u01C3\u01C4\x03\x02\x02\x02\u01C3\u01C1\x03\x02" + + "\x02\x02\u01C4\u01C6\x03\x02\x02\x02\u01C5\u01C3\x03\x02\x02\x02\u01C6" + + "\u01C7\x07\f\x02\x02\u01C7\x88\x03\x02\x02\x02\u01C8\u01C9\x071\x02\x02" + + "\u01C9\u01CA\x071\x02\x02\u01CA\u01CE\x03\x02\x02\x02\u01CB\u01CD\v\x02" + + "\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CD\u01D0\x03\x02\x02\x02\u01CE" + + "\u01CF\x03\x02\x02\x02\u01CE\u01CC\x03\x02\x02\x02\u01CF\u01D1\x03\x02" + + "\x02\x02\u01D0\u01CE\x03\x02\x02\x02\u01D1\u01D2\x07\f\x02\x02\u01D2\u01D3" + + "\x03\x02\x02\x02\u01D3\u01D4\bE\x02\x02\u01D4\x8A\x03\x02\x02\x02\u01D5" + + "\u01D6\x071\x02\x02\u01D6\u01D7\x07,\x02\x02\u01D7\u01DB\x03\x02\x02\x02" + + "\u01D8\u01DA\v\x02\x02\x02\u01D9\u01D8\x03\x02\x02\x02\u01DA\u01DD\x03" + + "\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DB\u01D9\x03\x02\x02\x02\u01DC" + + "\u01DE\x03\x02\x02\x02\u01DD\u01DB\x03\x02\x02\x02\u01DE\u01DF\x07,\x02" + + "\x02\u01DF\u01E0\x071\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E2" + + "\bF\x02\x02\u01E2\x8C\x03\x02\x02\x02\u01E3\u01E5\t\t\x02\x02\u01E4\u01E3" + + "\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02" + + "\u01E6\u01E7\x03\x02\x02\x02\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01E9\b" + + "G\x02\x02\u01E9\x8E\x03\x02\x02\x02\x14\x02\u0130\u013E\u0145\u0147\u0151" + + "\u0153\u0156\u01A2\u01A9\u01AB\u01B1\u01B8\u01BA\u01C3\u01CE\u01DB\u01E6" + + "\x03\b\x02\x02"; public static __ATN: ATN; public static get _ATN(): ATN { if (!QuintLexer.__ATN) { diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index d8e439e57..6c4ff86c6 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -13,13 +13,16 @@ import { TypeFunContext } from "./QuintParser"; import { TypeOperContext } from "./QuintParser"; import { TypeSetContext } from "./QuintParser"; import { TypeListContext } from "./QuintParser"; +import { TypeUnitContext } from "./QuintParser"; import { TypeTupleContext } from "./QuintParser"; import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeConstOrVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; +import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -45,14 +48,16 @@ import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; import { LiteralOrIdContext } from "./QuintParser"; import { TupleContext } from "./QuintParser"; +import { UnitContext } from "./QuintParser"; import { PairContext } from "./QuintParser"; import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; import { IfElseContext } from "./QuintParser"; import { LetInContext } from "./QuintParser"; -import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; +import { AnnotatedOperDefContext } from "./QuintParser"; +import { DeprecatedOperDefContext } from "./QuintParser"; import { ConstContext } from "./QuintParser"; import { VarContext } from "./QuintParser"; import { AssumeContext } from "./QuintParser"; @@ -67,8 +72,9 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; -import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; import { ExportModContext } from "./QuintParser"; @@ -78,6 +84,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -90,6 +97,7 @@ import { LambdaUnsugaredContext } from "./QuintParser"; import { LambdaTupleSugarContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; import { ParameterContext } from "./QuintParser"; +import { AnnotatedParameterContext } from "./QuintParser"; import { IdentOrStarContext } from "./QuintParser"; import { ArgListContext } from "./QuintParser"; import { RecElemContext } from "./QuintParser"; @@ -99,6 +107,7 @@ import { OperatorContext } from "./QuintParser"; import { LiteralContext } from "./QuintParser"; import { QualIdContext } from "./QuintParser"; import { SimpleIdContext } from "./QuintParser"; +import { IdentifierContext } from "./QuintParser"; /** @@ -158,6 +167,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeList?: (ctx: TypeListContext) => void; + /** + * Enter a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeUnit?: (ctx: TypeUnitContext) => void; + /** + * Exit a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeUnit?: (ctx: TypeUnitContext) => void; + /** * Enter a parse tree produced by the `typeTuple` * labeled alternative in `QuintParser.type`. @@ -224,17 +246,30 @@ export interface QuintListener extends ParseTreeListener { exitTypeBool?: (ctx: TypeBoolContext) => void; /** - * Enter a parse tree produced by the `typeConstOrVar` + * Enter a parse tree produced by the `typeVarCase` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeVarCase?: (ctx: TypeVarCaseContext) => void; + /** + * Exit a parse tree produced by the `typeVarCase` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeVarCase?: (ctx: TypeVarCaseContext) => void; + + /** + * Enter a parse tree produced by the `typeConst` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - enterTypeConstOrVar?: (ctx: TypeConstOrVarContext) => void; + enterTypeConst?: (ctx: TypeConstContext) => void; /** - * Exit a parse tree produced by the `typeConstOrVar` + * Exit a parse tree produced by the `typeConst` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree */ - exitTypeConstOrVar?: (ctx: TypeConstOrVarContext) => void; + exitTypeConst?: (ctx: TypeConstContext) => void; /** * Enter a parse tree produced by the `typeParen` @@ -249,6 +284,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTypeParen?: (ctx: TypeParenContext) => void; + /** + * Enter a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + enterTypeApp?: (ctx: TypeAppContext) => void; + /** + * Exit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + */ + exitTypeApp?: (ctx: TypeAppContext) => void; + /** * Enter a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -574,6 +622,19 @@ export interface QuintListener extends ParseTreeListener { */ exitTuple?: (ctx: TupleContext) => void; + /** + * Enter a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + enterUnit?: (ctx: UnitContext) => void; + /** + * Exit a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + exitUnit?: (ctx: UnitContext) => void; + /** * Enter a parse tree produced by the `pair` * labeled alternative in `QuintParser.expr`. @@ -639,19 +700,6 @@ export interface QuintListener extends ParseTreeListener { */ exitLetIn?: (ctx: LetInContext) => void; - /** - * Enter a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - */ - enterNondet?: (ctx: NondetContext) => void; - /** - * Exit a parse tree produced by the `nondet` - * labeled alternative in `QuintParser.expr`. - * @param ctx the parse tree - */ - exitNondet?: (ctx: NondetContext) => void; - /** * Enter a parse tree produced by the `paren` * labeled alternative in `QuintParser.expr`. @@ -678,6 +726,32 @@ export interface QuintListener extends ParseTreeListener { */ exitBraces?: (ctx: BracesContext) => void; + /** + * Enter a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + enterAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => void; + /** + * Exit a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + exitAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => void; + + /** + * Enter a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + enterDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => void; + /** + * Exit a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + */ + exitDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => void; + /** * Enter a parse tree produced by the `const` * labeled alternative in `QuintParser.declaration`. @@ -849,26 +923,37 @@ export interface QuintListener extends ParseTreeListener { exitTypeDef?: (ctx: TypeDefContext) => void; /** - * Enter a parse tree produced by `QuintParser.typeSumVariant`. + * Enter a parse tree produced by `QuintParser.typeDefHead`. * @param ctx the parse tree */ - enterTypeSumVariant?: (ctx: TypeSumVariantContext) => void; + enterTypeDefHead?: (ctx: TypeDefHeadContext) => void; /** - * Exit a parse tree produced by `QuintParser.typeSumVariant`. + * Exit a parse tree produced by `QuintParser.typeDefHead`. * @param ctx the parse tree */ - exitTypeSumVariant?: (ctx: TypeSumVariantContext) => void; + exitTypeDefHead?: (ctx: TypeDefHeadContext) => void; /** - * Enter a parse tree produced by `QuintParser.nondetOperDef`. + * Enter a parse tree produced by `QuintParser.sumTypeDefinition`. * @param ctx the parse tree */ - enterNondetOperDef?: (ctx: NondetOperDefContext) => void; + enterSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; /** - * Exit a parse tree produced by `QuintParser.nondetOperDef`. + * Exit a parse tree produced by `QuintParser.sumTypeDefinition`. * @param ctx the parse tree */ - exitNondetOperDef?: (ctx: NondetOperDefContext) => void; + exitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.typeSumVariant`. + * @param ctx the parse tree + */ + enterTypeSumVariant?: (ctx: TypeSumVariantContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeSumVariant`. + * @param ctx the parse tree + */ + exitTypeSumVariant?: (ctx: TypeSumVariantContext) => void; /** * Enter a parse tree produced by `QuintParser.qualifier`. @@ -969,6 +1054,17 @@ export interface QuintListener extends ParseTreeListener { */ exitType?: (ctx: TypeContext) => void; + /** + * Enter a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + enterTypeVar?: (ctx: TypeVarContext) => void; + /** + * Exit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + */ + exitTypeVar?: (ctx: TypeVarContext) => void; + /** * Enter a parse tree produced by `QuintParser.row`. * @param ctx the parse tree @@ -1101,6 +1197,17 @@ export interface QuintListener extends ParseTreeListener { */ exitParameter?: (ctx: ParameterContext) => void; + /** + * Enter a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + */ + enterAnnotatedParameter?: (ctx: AnnotatedParameterContext) => void; + /** + * Exit a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + */ + exitAnnotatedParameter?: (ctx: AnnotatedParameterContext) => void; + /** * Enter a parse tree produced by `QuintParser.identOrStar`. * @param ctx the parse tree @@ -1199,5 +1306,16 @@ export interface QuintListener extends ParseTreeListener { * @param ctx the parse tree */ exitSimpleId?: (ctx: SimpleIdContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + */ + enterIdentifier?: (ctx: IdentifierContext) => void; + /** + * Exit a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + */ + exitIdentifier?: (ctx: IdentifierContext) => void; } diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 9dc9dc78c..c4a7d6f24 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -80,87 +80,93 @@ export class QuintParser extends Parser { public static readonly OR = 44; public static readonly IFF = 45; public static readonly IMPLIES = 46; - public static readonly SET = 47; - public static readonly LIST = 48; - public static readonly MAP = 49; - public static readonly MATCH = 50; - public static readonly PLUS = 51; - public static readonly MINUS = 52; - public static readonly MUL = 53; - public static readonly DIV = 54; - public static readonly MOD = 55; - public static readonly GT = 56; - public static readonly LT = 57; - public static readonly GE = 58; - public static readonly LE = 59; - public static readonly NE = 60; - public static readonly EQ = 61; - public static readonly ASGN = 62; - public static readonly LPAREN = 63; - public static readonly RPAREN = 64; - public static readonly IDENTIFIER = 65; - public static readonly DOCCOMMENT = 66; - public static readonly LINE_COMMENT = 67; - public static readonly COMMENT = 68; - public static readonly WS = 69; + public static readonly MAP = 47; + public static readonly MATCH = 48; + public static readonly PLUS = 49; + public static readonly MINUS = 50; + public static readonly MUL = 51; + public static readonly DIV = 52; + public static readonly MOD = 53; + public static readonly GT = 54; + public static readonly LT = 55; + public static readonly GE = 56; + public static readonly LE = 57; + public static readonly NE = 58; + public static readonly EQ = 59; + public static readonly ASGN = 60; + public static readonly LPAREN = 61; + public static readonly RPAREN = 62; + public static readonly SET = 63; + public static readonly LIST = 64; + public static readonly LOW_ID = 65; + public static readonly CAP_ID = 66; + public static readonly DOCCOMMENT = 67; + public static readonly LINE_COMMENT = 68; + public static readonly COMMENT = 69; + public static readonly WS = 70; public static readonly RULE_modules = 0; public static readonly RULE_module = 1; public static readonly RULE_documentedDeclaration = 2; public static readonly RULE_declaration = 3; public static readonly RULE_operDef = 4; public static readonly RULE_typeDef = 5; - public static readonly RULE_typeSumVariant = 6; - public static readonly RULE_nondetOperDef = 7; - public static readonly RULE_qualifier = 8; - public static readonly RULE_importMod = 9; - public static readonly RULE_exportMod = 10; - public static readonly RULE_instanceMod = 11; - public static readonly RULE_moduleName = 12; - public static readonly RULE_name = 13; - public static readonly RULE_qualifiedName = 14; - public static readonly RULE_fromSource = 15; - public static readonly RULE_type = 16; - public static readonly RULE_row = 17; - public static readonly RULE_rowLabel = 18; - public static readonly RULE_expr = 19; - public static readonly RULE_matchSumExpr = 20; - public static readonly RULE_matchSumCase = 21; - public static readonly RULE_matchSumVariant = 22; - public static readonly RULE_declarationOrExpr = 23; - public static readonly RULE_lambda = 24; - public static readonly RULE_lambdaUnsugared = 25; - public static readonly RULE_lambdaTupleSugar = 26; - public static readonly RULE_identOrHole = 27; - public static readonly RULE_parameter = 28; - public static readonly RULE_identOrStar = 29; - public static readonly RULE_argList = 30; - public static readonly RULE_recElem = 31; - public static readonly RULE_normalCallName = 32; - public static readonly RULE_nameAfterDot = 33; - public static readonly RULE_operator = 34; - public static readonly RULE_literal = 35; - public static readonly RULE_qualId = 36; - public static readonly RULE_simpleId = 37; + public static readonly RULE_typeDefHead = 6; + public static readonly RULE_sumTypeDefinition = 7; + public static readonly RULE_typeSumVariant = 8; + public static readonly RULE_qualifier = 9; + public static readonly RULE_importMod = 10; + public static readonly RULE_exportMod = 11; + public static readonly RULE_instanceMod = 12; + public static readonly RULE_moduleName = 13; + public static readonly RULE_name = 14; + public static readonly RULE_qualifiedName = 15; + public static readonly RULE_fromSource = 16; + public static readonly RULE_type = 17; + public static readonly RULE_typeVar = 18; + public static readonly RULE_row = 19; + public static readonly RULE_rowLabel = 20; + public static readonly RULE_expr = 21; + public static readonly RULE_matchSumExpr = 22; + public static readonly RULE_matchSumCase = 23; + public static readonly RULE_matchSumVariant = 24; + public static readonly RULE_declarationOrExpr = 25; + public static readonly RULE_lambda = 26; + public static readonly RULE_lambdaUnsugared = 27; + public static readonly RULE_lambdaTupleSugar = 28; + public static readonly RULE_identOrHole = 29; + public static readonly RULE_parameter = 30; + public static readonly RULE_annotatedParameter = 31; + public static readonly RULE_identOrStar = 32; + public static readonly RULE_argList = 33; + public static readonly RULE_recElem = 34; + public static readonly RULE_normalCallName = 35; + public static readonly RULE_nameAfterDot = 36; + public static readonly RULE_operator = 37; + public static readonly RULE_literal = 38; + public static readonly RULE_qualId = 39; + public static readonly RULE_simpleId = 40; + public static readonly RULE_identifier = 41; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedDeclaration", "declaration", "operDef", - "typeDef", "typeSumVariant", "nondetOperDef", "qualifier", "importMod", - "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", "fromSource", - "type", "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", - "declarationOrExpr", "lambda", "lambdaUnsugared", "lambdaTupleSugar", - "identOrHole", "parameter", "identOrStar", "argList", "recElem", "normalCallName", - "nameAfterDot", "operator", "literal", "qualId", "simpleId", + "typeDef", "typeDefHead", "sumTypeDefinition", "typeSumVariant", "qualifier", + "importMod", "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", + "fromSource", "type", "typeVar", "row", "rowLabel", "expr", "matchSumExpr", + "matchSumCase", "matchSumVariant", "declarationOrExpr", "lambda", "lambdaUnsugared", + "lambdaTupleSugar", "identOrHole", "parameter", "annotatedParameter", + "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", + "operator", "literal", "qualId", "simpleId", "identifier", ]; private static readonly _LITERAL_NAMES: Array = [ undefined, "'module'", "'{'", "'}'", "'const'", "':'", "'var'", "'assume'", - "','", "';'", "'type'", "'|'", "'nondet'", "'val'", "'def'", "'pure'", - "'action'", "'run'", "'temporal'", "'import'", "'.'", "'from'", "'as'", - "'export'", "'->'", "'=>'", "'['", "']'", "'int'", "'str'", "'bool'", - "'^'", "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", - undefined, undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", - "'Set'", "'List'", "'Map'", "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", - "'>'", "'<'", "'>='", "'<='", "'!='", "'=='", "'='", "'('", "')'", + "','", "';'", "'type'", "'['", "']'", "'|'", "'val'", "'def'", "'pure'", + "'action'", "'run'", "'temporal'", "'nondet'", "'import'", "'.'", "'from'", + "'as'", "'export'", "'->'", "'=>'", "'int'", "'str'", "'bool'", "'^'", + "'''", "'all'", "'any'", "'if'", "'else'", "'_'", "'...'", "'::'", undefined, + undefined, undefined, "'and'", "'or'", "'iff'", "'implies'", "'Map'", + "'match'", "'+'", "'-'", "'*'", "'/'", "'%'", "'>'", "'<'", "'>='", "'<='", + "'!='", "'=='", "'='", "'('", "')'", "'Set'", "'List'", ]; private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, @@ -169,10 +175,10 @@ export class QuintParser extends Parser { undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "STRING", "BOOL", - "INT", "AND", "OR", "IFF", "IMPLIES", "SET", "LIST", "MAP", "MATCH", "PLUS", - "MINUS", "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", - "LPAREN", "RPAREN", "IDENTIFIER", "DOCCOMMENT", "LINE_COMMENT", "COMMENT", - "WS", + "INT", "AND", "OR", "IFF", "IMPLIES", "MAP", "MATCH", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "GT", "LT", "GE", "LE", "NE", "EQ", "ASGN", "LPAREN", + "RPAREN", "SET", "LIST", "LOW_ID", "CAP_ID", "DOCCOMMENT", "LINE_COMMENT", + "COMMENT", "WS", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(QuintParser._LITERAL_NAMES, QuintParser._SYMBOLIC_NAMES, []); @@ -208,21 +214,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 77; + this.state = 85; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 76; + this.state = 84; this.module(); } } - this.state = 79; + this.state = 87; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 81; + this.state = 89; this.match(QuintParser.EOF); } } @@ -248,41 +254,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 86; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 83; + this.state = 91; this.match(QuintParser.DOCCOMMENT); } } - this.state = 88; + this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 89; + this.state = 97; this.match(QuintParser.T__0); - this.state = 90; + this.state = 98; this.qualId(); - this.state = 91; + this.state = 99; this.match(QuintParser.T__1); - this.state = 95; + this.state = 103; this._errHandler.sync(this); _la = this._input.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__22))) !== 0) || _la === QuintParser.DOCCOMMENT) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19) | (1 << QuintParser.T__20) | (1 << QuintParser.T__24))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 92; + this.state = 100; this.documentedDeclaration(); } } - this.state = 97; + this.state = 105; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 98; + this.state = 106; this.match(QuintParser.T__2); } } @@ -308,21 +314,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 103; + this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 100; + this.state = 108; this.match(QuintParser.DOCCOMMENT); } } - this.state = 105; + this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 106; + this.state = 114; this.declaration(); } } @@ -345,20 +351,20 @@ export class QuintParser extends Parser { let _localctx: DeclarationContext = new DeclarationContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_declaration); try { - this.state = 128; + this.state = 136; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 108; + this.state = 116; this.match(QuintParser.T__3); - this.state = 109; + this.state = 117; this.qualId(); - this.state = 110; + this.state = 118; this.match(QuintParser.T__4); - this.state = 111; + this.state = 119; this.type(0); } break; @@ -367,13 +373,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 113; + this.state = 121; this.match(QuintParser.T__5); - this.state = 114; + this.state = 122; this.qualId(); - this.state = 115; + this.state = 123; this.match(QuintParser.T__4); - this.state = 116; + this.state = 124; this.type(0); } break; @@ -382,13 +388,15 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 118; + this.state = 126; this.match(QuintParser.T__6); - this.state = 119; - this.identOrHole(); - this.state = 120; + { + this.state = 127; + (_localctx as AssumeContext)._assumeName = this.identOrHole(); + } + this.state = 128; this.match(QuintParser.ASGN); - this.state = 121; + this.state = 129; this.expr(0); } break; @@ -397,7 +405,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 123; + this.state = 131; this.instanceMod(); } break; @@ -406,7 +414,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 124; + this.state = 132; this.operDef(); } break; @@ -415,7 +423,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 125; + this.state = 133; this.typeDef(); } break; @@ -424,7 +432,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 126; + this.state = 134; this.importMod(); } break; @@ -433,7 +441,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 127; + this.state = 135; this.exportMod(); } break; @@ -459,56 +467,66 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 8, QuintParser.RULE_operDef); let _la: number; try { - this.enterOuterAlt(_localctx, 1); - { - this.state = 130; - this.qualifier(); - this.state = 131; - this.normalCallName(); - this.state = 168; + this.state = 186; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: + _localctx = new AnnotatedOperDefContext(_localctx); + this.enterOuterAlt(_localctx, 1); { - this.state = 132; + this.state = 138; + this.qualifier(); + this.state = 139; + this.normalCallName(); + this.state = 140; this.match(QuintParser.LPAREN); + { this.state = 141; + (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); + (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); + this.state = 146; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__36 || _la === QuintParser.IDENTIFIER) { + while (_la === QuintParser.T__7) { { - this.state = 133; - this.parameter(); - this.state = 138; + { + this.state = 142; + this.match(QuintParser.T__7); + this.state = 143; + (_localctx as AnnotatedOperDefContext)._annotatedParameter = this.annotatedParameter(); + (_localctx as AnnotatedOperDefContext)._annotOperParam.push((_localctx as AnnotatedOperDefContext)._annotatedParameter); + } + } + this.state = 148; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { - { - this.state = 134; - this.match(QuintParser.T__7); - this.state = 135; - this.parameter(); - } - } - this.state = 140; - this._errHandler.sync(this); - _la = this._input.LA(1); - } + } + } + this.state = 149; + this.match(QuintParser.RPAREN); + this.state = 150; + this.match(QuintParser.T__4); + this.state = 151; + this.type(0); + this.state = 154; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.ASGN) { + { + this.state = 152; + this.match(QuintParser.ASGN); + this.state = 153; + this.expr(0); } } - this.state = 143; - this.match(QuintParser.RPAREN); - this.state = 146; + this.state = 157; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__4) { + if (_la === QuintParser.T__8) { { - this.state = 144; - this.match(QuintParser.T__4); - this.state = 145; - this.type(0); + this.state = 156; + this.match(QuintParser.T__8); } } @@ -516,77 +534,89 @@ export class QuintParser extends Parser { break; case 2: + _localctx = new DeprecatedOperDefContext(_localctx); + this.enterOuterAlt(_localctx, 2); { - this.state = 148; - this.match(QuintParser.T__4); - this.state = 149; - this.type(0); - } - break; + this.state = 159; + this.qualifier(); + this.state = 160; + this.normalCallName(); + this.state = 173; + this._errHandler.sync(this); + switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { + case 1: + { + this.state = 161; + this.match(QuintParser.LPAREN); + this.state = 170; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & ((1 << (QuintParser.T__36 - 37)) | (1 << (QuintParser.LOW_ID - 37)) | (1 << (QuintParser.CAP_ID - 37)))) !== 0)) { + { + this.state = 162; + (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); + (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); + this.state = 167; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 163; + this.match(QuintParser.T__7); + this.state = 164; + (_localctx as DeprecatedOperDefContext)._parameter = this.parameter(); + (_localctx as DeprecatedOperDefContext)._operParam.push((_localctx as DeprecatedOperDefContext)._parameter); + } + } + this.state = 169; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } + } - case 3: - { - this.state = 150; - this.match(QuintParser.LPAREN); - { - this.state = 151; - this.parameter(); - this.state = 152; - this.match(QuintParser.T__4); - this.state = 153; - this.type(0); - this.state = 161; + this.state = 172; + this.match(QuintParser.RPAREN); + } + break; + } + this.state = 177; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__7) { - { + if (_la === QuintParser.T__4) { { - this.state = 154; - this.match(QuintParser.T__7); - this.state = 155; - this.parameter(); - this.state = 156; + this.state = 175; this.match(QuintParser.T__4); - this.state = 157; - this.type(0); - } + this.state = 176; + (_localctx as DeprecatedOperDefContext)._annotatedRetType = this.type(0); } - this.state = 163; - this._errHandler.sync(this); - _la = this._input.LA(1); - } } - this.state = 164; - this.match(QuintParser.RPAREN); - this.state = 165; - this.match(QuintParser.T__4); - this.state = 166; - this.type(0); - } - break; - } - this.state = 172; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.ASGN) { - { - this.state = 170; - this.match(QuintParser.ASGN); - this.state = 171; - this.expr(0); + + this.state = 181; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.ASGN) { + { + this.state = 179; + this.match(QuintParser.ASGN); + this.state = 180; + this.expr(0); + } } - } - this.state = 175; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__8) { - { - this.state = 174; - this.match(QuintParser.T__8); + this.state = 184; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__8) { + { + this.state = 183; + this.match(QuintParser.T__8); + } } - } + } + break; } } catch (re) { @@ -607,18 +637,17 @@ export class QuintParser extends Parser { public typeDef(): TypeDefContext { let _localctx: TypeDefContext = new TypeDefContext(this._ctx, this.state); this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); - let _la: number; try { - this.state = 198; + this.state = 200; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 15, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 177; + this.state = 188; this.match(QuintParser.T__9); - this.state = 178; + this.state = 189; this.qualId(); } break; @@ -627,13 +656,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 179; + this.state = 190; this.match(QuintParser.T__9); - this.state = 180; - this.qualId(); - this.state = 181; + this.state = 191; + this.typeDefHead(); + this.state = 192; this.match(QuintParser.ASGN); - this.state = 182; + this.state = 193; this.type(0); } break; @@ -642,42 +671,74 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 184; + this.state = 195; this.match(QuintParser.T__9); - this.state = 185; - (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 186; + this.state = 196; + this.typeDefHead(); + this.state = 197; this.match(QuintParser.ASGN); - this.state = 188; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__10) { - { - this.state = 187; - this.match(QuintParser.T__10); - } + this.state = 198; + this.sumTypeDefinition(); } - - this.state = 190; - this.typeSumVariant(); - this.state = 195; + break; + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public typeDefHead(): TypeDefHeadContext { + let _localctx: TypeDefHeadContext = new TypeDefHeadContext(this._ctx, this.state); + this.enterRule(_localctx, 12, QuintParser.RULE_typeDefHead); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 202; + _localctx._typeName = this.qualId(); + this.state = 213; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__10) { + { + this.state = 203; + this.match(QuintParser.T__10); + this.state = 204; + _localctx._LOW_ID = this.match(QuintParser.LOW_ID); + _localctx._typeVars.push(_localctx._LOW_ID); + this.state = 209; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__7) { { { - this.state = 191; - this.match(QuintParser.T__10); - this.state = 192; - this.typeSumVariant(); + this.state = 205; + this.match(QuintParser.T__7); + this.state = 206; + _localctx._LOW_ID = this.match(QuintParser.LOW_ID); + _localctx._typeVars.push(_localctx._LOW_ID); } } - this.state = 197; + this.state = 211; this._errHandler.sync(this); _la = this._input.LA(1); } + this.state = 212; + this.match(QuintParser.T__11); } - break; + } + } } catch (re) { @@ -695,29 +756,41 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) - public typeSumVariant(): TypeSumVariantContext { - let _localctx: TypeSumVariantContext = new TypeSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 12, QuintParser.RULE_typeSumVariant); + public sumTypeDefinition(): SumTypeDefinitionContext { + let _localctx: SumTypeDefinitionContext = new SumTypeDefinitionContext(this._ctx, this.state); + this.enterRule(_localctx, 14, QuintParser.RULE_sumTypeDefinition); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 200; - _localctx._sumLabel = this.simpleId("variant label"); - this.state = 205; + this.state = 216; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.LPAREN) { + if (_la === QuintParser.T__12) { { - this.state = 201; - this.match(QuintParser.LPAREN); - this.state = 202; - this.type(0); - this.state = 203; - this.match(QuintParser.RPAREN); + this.state = 215; + this.match(QuintParser.T__12); } } + this.state = 218; + this.typeSumVariant(); + this.state = 223; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__12) { + { + { + this.state = 219; + this.match(QuintParser.T__12); + this.state = 220; + this.typeSumVariant(); + } + } + this.state = 225; + this._errHandler.sync(this); + _la = this._input.LA(1); + } } } catch (re) { @@ -735,40 +808,26 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) - public nondetOperDef(): NondetOperDefContext { - let _localctx: NondetOperDefContext = new NondetOperDefContext(this._ctx, this.state); - this.enterRule(_localctx, 14, QuintParser.RULE_nondetOperDef); + public typeSumVariant(): TypeSumVariantContext { + let _localctx: TypeSumVariantContext = new TypeSumVariantContext(this._ctx, this.state); + this.enterRule(_localctx, 16, QuintParser.RULE_typeSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 207; - this.match(QuintParser.T__11); - this.state = 208; - this.qualId(); - this.state = 211; + this.state = 226; + _localctx._sumLabel = this.simpleId("variant label"); + this.state = 231; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__4) { + if (_la === QuintParser.LPAREN) { { - this.state = 209; - this.match(QuintParser.T__4); - this.state = 210; + this.state = 227; + this.match(QuintParser.LPAREN); + this.state = 228; this.type(0); - } - } - - this.state = 213; - this.match(QuintParser.ASGN); - this.state = 214; - this.expr(0); - this.state = 216; - this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.T__8) { - { - this.state = 215; - this.match(QuintParser.T__8); + this.state = 229; + this.match(QuintParser.RPAREN); } } @@ -791,68 +850,76 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifier(): QualifierContext { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); - this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); + this.enterRule(_localctx, 18, QuintParser.RULE_qualifier); try { - this.state = 227; + this.state = 243; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 218; - this.match(QuintParser.T__12); + this.state = 233; + this.match(QuintParser.T__13); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 219; - this.match(QuintParser.T__13); + this.state = 234; + this.match(QuintParser.T__14); } break; case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 220; - this.match(QuintParser.T__14); - this.state = 221; - this.match(QuintParser.T__12); + this.state = 235; + this.match(QuintParser.T__15); + this.state = 236; + this.match(QuintParser.T__13); } break; case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 222; + this.state = 237; + this.match(QuintParser.T__15); + this.state = 238; this.match(QuintParser.T__14); - this.state = 223; - this.match(QuintParser.T__13); } break; case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 224; - this.match(QuintParser.T__15); + this.state = 239; + this.match(QuintParser.T__16); } break; case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 225; - this.match(QuintParser.T__16); + this.state = 240; + this.match(QuintParser.T__17); } break; case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 226; - this.match(QuintParser.T__17); + this.state = 241; + this.match(QuintParser.T__18); + } + break; + + case 8: + this.enterOuterAlt(_localctx, 8); + { + this.state = 242; + this.match(QuintParser.T__19); } break; } @@ -874,31 +941,31 @@ export class QuintParser extends Parser { // @RuleVersion(0) public importMod(): ImportModContext { let _localctx: ImportModContext = new ImportModContext(this._ctx, this.state); - this.enterRule(_localctx, 18, QuintParser.RULE_importMod); + this.enterRule(_localctx, 20, QuintParser.RULE_importMod); let _la: number; try { - this.state = 247; + this.state = 263; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 25, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 229; - this.match(QuintParser.T__18); - this.state = 230; + this.state = 245; + this.match(QuintParser.T__20); + this.state = 246; this.name(); - this.state = 231; - this.match(QuintParser.T__19); - this.state = 232; + this.state = 247; + this.match(QuintParser.T__21); + this.state = 248; this.identOrStar(); - this.state = 235; + this.state = 251; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 233; - this.match(QuintParser.T__20); - this.state = 234; + this.state = 249; + this.match(QuintParser.T__22); + this.state = 250; this.fromSource(); } } @@ -909,30 +976,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 237; - this.match(QuintParser.T__18); - this.state = 238; + this.state = 253; + this.match(QuintParser.T__20); + this.state = 254; this.name(); - this.state = 241; + this.state = 257; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 239; - this.match(QuintParser.T__21); - this.state = 240; + this.state = 255; + this.match(QuintParser.T__23); + this.state = 256; this.name(); } } - this.state = 245; + this.state = 261; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 243; - this.match(QuintParser.T__20); - this.state = 244; + this.state = 259; + this.match(QuintParser.T__22); + this.state = 260; this.fromSource(); } } @@ -958,22 +1025,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public exportMod(): ExportModContext { let _localctx: ExportModContext = new ExportModContext(this._ctx, this.state); - this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); + this.enterRule(_localctx, 22, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 260; + this.state = 276; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 27, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 249; - this.match(QuintParser.T__22); - this.state = 250; + this.state = 265; + this.match(QuintParser.T__24); + this.state = 266; this.name(); - this.state = 251; - this.match(QuintParser.T__19); - this.state = 252; + this.state = 267; + this.match(QuintParser.T__21); + this.state = 268; this.identOrStar(); } break; @@ -981,18 +1048,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 254; - this.match(QuintParser.T__22); - this.state = 255; + this.state = 270; + this.match(QuintParser.T__24); + this.state = 271; this.name(); - this.state = 258; + this.state = 274; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__21) { + if (_la === QuintParser.T__23) { { - this.state = 256; - this.match(QuintParser.T__21); - this.state = 257; + this.state = 272; + this.match(QuintParser.T__23); + this.state = 273; this.name(); } } @@ -1018,63 +1085,63 @@ export class QuintParser extends Parser { // @RuleVersion(0) public instanceMod(): InstanceModContext { let _localctx: InstanceModContext = new InstanceModContext(this._ctx, this.state); - this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); + this.enterRule(_localctx, 24, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 308; + this.state = 324; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 32, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 262; - this.match(QuintParser.T__18); - this.state = 263; + this.state = 278; + this.match(QuintParser.T__20); + this.state = 279; this.moduleName(); - this.state = 264; + this.state = 280; this.match(QuintParser.LPAREN); { - this.state = 265; + this.state = 281; this.name(); - this.state = 266; + this.state = 282; this.match(QuintParser.ASGN); - this.state = 267; + this.state = 283; this.expr(0); - this.state = 275; + this.state = 291; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 268; + this.state = 284; this.match(QuintParser.T__7); - this.state = 269; + this.state = 285; this.name(); - this.state = 270; + this.state = 286; this.match(QuintParser.ASGN); - this.state = 271; + this.state = 287; this.expr(0); } } - this.state = 277; + this.state = 293; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 278; + this.state = 294; this.match(QuintParser.RPAREN); - this.state = 279; - this.match(QuintParser.T__19); - this.state = 280; + this.state = 295; + this.match(QuintParser.T__21); + this.state = 296; this.match(QuintParser.MUL); - this.state = 283; + this.state = 299; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 281; - this.match(QuintParser.T__20); - this.state = 282; + this.state = 297; + this.match(QuintParser.T__22); + this.state = 298; this.fromSource(); } } @@ -1085,54 +1152,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 285; - this.match(QuintParser.T__18); - this.state = 286; + this.state = 301; + this.match(QuintParser.T__20); + this.state = 302; this.moduleName(); - this.state = 287; + this.state = 303; this.match(QuintParser.LPAREN); { - this.state = 288; + this.state = 304; this.name(); - this.state = 289; + this.state = 305; this.match(QuintParser.ASGN); - this.state = 290; + this.state = 306; this.expr(0); - this.state = 298; + this.state = 314; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 291; + this.state = 307; this.match(QuintParser.T__7); - this.state = 292; + this.state = 308; this.name(); - this.state = 293; + this.state = 309; this.match(QuintParser.ASGN); - this.state = 294; + this.state = 310; this.expr(0); } } - this.state = 300; + this.state = 316; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 301; + this.state = 317; this.match(QuintParser.RPAREN); - this.state = 302; - this.match(QuintParser.T__21); - this.state = 303; + this.state = 318; + this.match(QuintParser.T__23); + this.state = 319; this.qualifiedName(); - this.state = 306; + this.state = 322; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__20) { + if (_la === QuintParser.T__22) { { - this.state = 304; - this.match(QuintParser.T__20); - this.state = 305; + this.state = 320; + this.match(QuintParser.T__22); + this.state = 321; this.fromSource(); } } @@ -1158,11 +1225,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public moduleName(): ModuleNameContext { let _localctx: ModuleNameContext = new ModuleNameContext(this._ctx, this.state); - this.enterRule(_localctx, 24, QuintParser.RULE_moduleName); + this.enterRule(_localctx, 26, QuintParser.RULE_moduleName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 310; + this.state = 326; this.qualId(); } } @@ -1183,11 +1250,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public name(): NameContext { let _localctx: NameContext = new NameContext(this._ctx, this.state); - this.enterRule(_localctx, 26, QuintParser.RULE_name); + this.enterRule(_localctx, 28, QuintParser.RULE_name); try { this.enterOuterAlt(_localctx, 1); { - this.state = 312; + this.state = 328; this.qualId(); } } @@ -1208,11 +1275,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let _localctx: QualifiedNameContext = new QualifiedNameContext(this._ctx, this.state); - this.enterRule(_localctx, 28, QuintParser.RULE_qualifiedName); + this.enterRule(_localctx, 30, QuintParser.RULE_qualifiedName); try { this.enterOuterAlt(_localctx, 1); { - this.state = 314; + this.state = 330; this.qualId(); } } @@ -1233,11 +1300,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public fromSource(): FromSourceContext { let _localctx: FromSourceContext = new FromSourceContext(this._ctx, this.state); - this.enterRule(_localctx, 30, QuintParser.RULE_fromSource); + this.enterRule(_localctx, 32, QuintParser.RULE_fromSource); try { this.enterOuterAlt(_localctx, 1); { - this.state = 316; + this.state = 332; this.match(QuintParser.STRING); } } @@ -1268,68 +1335,68 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: TypeContext = new TypeContext(this._ctx, _parentState); let _prevctx: TypeContext = _localctx; - let _startState: number = 32; - this.enterRecursionRule(_localctx, 32, QuintParser.RULE_type, _p); + let _startState: number = 34; + this.enterRecursionRule(_localctx, 34, QuintParser.RULE_type, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 374; + this.state = 406; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 35, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 40, this._ctx) ) { case 1: { _localctx = new TypeOperContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 319; + this.state = 335; this.match(QuintParser.LPAREN); - this.state = 328; + this.state = 344; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.IDENTIFIER - 47)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 61)) & ~0x1F) === 0 && ((1 << (_la - 61)) & ((1 << (QuintParser.LPAREN - 61)) | (1 << (QuintParser.SET - 61)) | (1 << (QuintParser.LIST - 61)) | (1 << (QuintParser.LOW_ID - 61)) | (1 << (QuintParser.CAP_ID - 61)))) !== 0)) { { - this.state = 320; + this.state = 336; this.type(0); - this.state = 325; + this.state = 341; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 321; + this.state = 337; this.match(QuintParser.T__7); - this.state = 322; + this.state = 338; this.type(0); } } } - this.state = 327; + this.state = 343; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } } } - this.state = 331; + this.state = 347; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 330; + this.state = 346; this.match(QuintParser.T__7); } } - this.state = 333; + this.state = 349; this.match(QuintParser.RPAREN); - this.state = 334; - this.match(QuintParser.T__24); - this.state = 335; - this.type(10); + this.state = 350; + this.match(QuintParser.T__26); + this.state = 351; + this.type(13); } break; @@ -1338,14 +1405,14 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 336; + this.state = 352; this.match(QuintParser.SET); - this.state = 337; - this.match(QuintParser.T__25); - this.state = 338; + this.state = 353; + this.match(QuintParser.T__10); + this.state = 354; this.type(0); - this.state = 339; - this.match(QuintParser.T__26); + this.state = 355; + this.match(QuintParser.T__11); } break; @@ -1354,135 +1421,201 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 341; + this.state = 357; this.match(QuintParser.LIST); - this.state = 342; - this.match(QuintParser.T__25); - this.state = 343; + this.state = 358; + this.match(QuintParser.T__10); + this.state = 359; this.type(0); - this.state = 344; - this.match(QuintParser.T__26); + this.state = 360; + this.match(QuintParser.T__11); } break; case 4: + { + _localctx = new TypeUnitContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 362; + this.match(QuintParser.LPAREN); + this.state = 363; + this.match(QuintParser.RPAREN); + } + break; + + case 5: { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 346; + this.state = 364; this.match(QuintParser.LPAREN); - this.state = 347; + this.state = 365; this.type(0); - this.state = 348; + this.state = 366; this.match(QuintParser.T__7); - this.state = 349; + this.state = 367; this.type(0); - this.state = 354; + this.state = 372; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 350; + this.state = 368; this.match(QuintParser.T__7); - this.state = 351; + this.state = 369; this.type(0); } } } - this.state = 356; + this.state = 374; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 36, this._ctx); } - this.state = 358; + this.state = 376; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 357; + this.state = 375; this.match(QuintParser.T__7); } } - this.state = 360; + this.state = 378; this.match(QuintParser.RPAREN); } break; - case 5: + case 6: { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 362; + this.state = 380; this.match(QuintParser.T__1); - this.state = 363; - this.row(); - this.state = 364; + this.state = 382; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__12 || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { + { + this.state = 381; + this.row(); + } + } + + this.state = 384; this.match(QuintParser.T__2); } break; - case 6: + case 7: { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 366; + this.state = 385; this.match(QuintParser.T__27); } break; - case 7: + case 8: { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 367; + this.state = 386; this.match(QuintParser.T__28); } break; - case 8: + case 9: { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 368; + this.state = 387; this.match(QuintParser.T__29); } break; - case 9: + case 10: + { + _localctx = new TypeVarCaseContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 388; + this.typeVar(); + } + break; + + case 11: { - _localctx = new TypeConstOrVarContext(_localctx); + _localctx = new TypeConstContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 369; + this.state = 389; this.qualId(); } break; - case 10: + case 12: { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 370; + this.state = 390; this.match(QuintParser.LPAREN); - this.state = 371; + this.state = 391; this.type(0); - this.state = 372; + this.state = 392; this.match(QuintParser.RPAREN); } break; + + case 13: + { + _localctx = new TypeAppContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 394; + (_localctx as TypeAppContext)._typeCtor = this.qualId(); + { + this.state = 395; + this.match(QuintParser.T__10); + this.state = 396; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + this.state = 401; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__7) { + { + { + this.state = 397; + this.match(QuintParser.T__7); + this.state = 398; + (_localctx as TypeAppContext)._type = this.type(0); + (_localctx as TypeAppContext)._typeArg.push((_localctx as TypeAppContext)._type); + } + } + this.state = 403; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 404; + this.match(QuintParser.T__11); + } + } + break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 384; + this.state = 416; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1490,21 +1623,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 382; + this.state = 414; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 41, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 376; - if (!(this.precpred(this._ctx, 12))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); + this.state = 408; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 377; - this.match(QuintParser.T__23); - this.state = 378; - this.type(12); + this.state = 409; + this.match(QuintParser.T__25); + this.state = 410; + this.type(15); } break; @@ -1512,22 +1645,22 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 379; - if (!(this.precpred(this._ctx, 11))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 11)"); + this.state = 411; + if (!(this.precpred(this._ctx, 14))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 380; - this.match(QuintParser.T__24); - this.state = 381; - this.type(11); + this.state = 412; + this.match(QuintParser.T__26); + this.state = 413; + this.type(14); } break; } } } - this.state = 386; + this.state = 418; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 37, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 42, this._ctx); } } } @@ -1546,91 +1679,107 @@ export class QuintParser extends Parser { return _localctx; } // @RuleVersion(0) + public typeVar(): TypeVarContext { + let _localctx: TypeVarContext = new TypeVarContext(this._ctx, this.state); + this.enterRule(_localctx, 36, QuintParser.RULE_typeVar); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 419; + this.match(QuintParser.LOW_ID); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) public row(): RowContext { let _localctx: RowContext = new RowContext(this._ctx, this.state); - this.enterRule(_localctx, 34, QuintParser.RULE_row); - let _la: number; + this.enterRule(_localctx, 38, QuintParser.RULE_row); try { let _alt: number; - this.state = 410; + this.state = 442; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.T__2: - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 394; + { + this.state = 421; + this.rowLabel(); + this.state = 422; + this.match(QuintParser.T__4); + this.state = 423; + this.type(0); + } + this.state = 432; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 387; + this.state = 425; + this.match(QuintParser.T__7); + this.state = 426; this.rowLabel(); - this.state = 388; + this.state = 427; this.match(QuintParser.T__4); - this.state = 389; + this.state = 428; this.type(0); - this.state = 390; - this.match(QuintParser.T__7); } } } - this.state = 396; + this.state = 434; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); } - this.state = 406; + this.state = 438; this._errHandler.sync(this); - _la = this._input.LA(1); - if (_la === QuintParser.IDENTIFIER) { - { + switch (this._input.LA(1)) { + case QuintParser.T__7: { - this.state = 397; - this.rowLabel(); - this.state = 398; - this.match(QuintParser.T__4); - this.state = 399; - this.type(0); + this.state = 435; + this.match(QuintParser.T__7); } - this.state = 404; - this._errHandler.sync(this); - switch (this._input.LA(1)) { - case QuintParser.T__7: - { - this.state = 401; - this.match(QuintParser.T__7); - } - break; - case QuintParser.T__10: - { - this.state = 402; - this.match(QuintParser.T__10); - { - this.state = 403; - _localctx._rowVar = this.match(QuintParser.IDENTIFIER); - } - } - break; - case QuintParser.T__2: - break; - default: - break; + break; + case QuintParser.T__12: + { + this.state = 436; + this.match(QuintParser.T__12); + { + this.state = 437; + _localctx._rowVar = this.identifier(); } } + break; + case QuintParser.T__2: + break; + default: + break; } - } break; - case QuintParser.T__10: + case QuintParser.T__12: this.enterOuterAlt(_localctx, 2); { - this.state = 408; - this.match(QuintParser.T__10); + this.state = 440; + this.match(QuintParser.T__12); { - this.state = 409; - _localctx._rowVar = this.match(QuintParser.IDENTIFIER); + this.state = 441; + _localctx._rowVar = this.identifier(); } } break; @@ -1655,11 +1804,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public rowLabel(): RowLabelContext { let _localctx: RowLabelContext = new RowLabelContext(this._ctx, this.state); - this.enterRule(_localctx, 36, QuintParser.RULE_rowLabel); + this.enterRule(_localctx, 40, QuintParser.RULE_rowLabel); try { this.enterOuterAlt(_localctx, 1); { - this.state = 412; + this.state = 444; this.simpleId("record"); } } @@ -1690,23 +1839,23 @@ export class QuintParser extends Parser { let _parentState: number = this.state; let _localctx: ExprContext = new ExprContext(this._ctx, _parentState); let _prevctx: ExprContext = _localctx; - let _startState: number = 38; - this.enterRecursionRule(_localctx, 38, QuintParser.RULE_expr, _p); + let _startState: number = 42; + this.enterRecursionRule(_localctx, 42, QuintParser.RULE_expr, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 564; + this.state = 595; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 59, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 63, this._ctx) ) { case 1: { _localctx = new LambdaConsContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 415; + this.state = 447; this.lambda(); } break; @@ -1716,21 +1865,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 416; + this.state = 448; this.normalCallName(); - this.state = 417; + this.state = 449; this.match(QuintParser.LPAREN); - this.state = 419; + this.state = 451; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 418; + this.state = 450; this.argList(); } } - this.state = 421; + this.state = 453; this.match(QuintParser.RPAREN); } break; @@ -1740,9 +1889,9 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 423; + this.state = 455; this.match(QuintParser.MINUS); - this.state = 424; + this.state = 456; this.expr(25); } break; @@ -1752,13 +1901,13 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 425; + this.state = 457; this.qualId(); - this.state = 426; + this.state = 458; this.match(QuintParser.T__31); - this.state = 427; + this.state = 459; this.match(QuintParser.ASGN); - this.state = 428; + this.state = 460; this.expr(21); } break; @@ -1768,41 +1917,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 430; + this.state = 462; this.match(QuintParser.AND); - this.state = 431; + this.state = 463; this.match(QuintParser.T__1); - this.state = 432; + this.state = 464; this.expr(0); - this.state = 437; + this.state = 469; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 433; + this.state = 465; this.match(QuintParser.T__7); - this.state = 434; + this.state = 466; this.expr(0); } } } - this.state = 439; + this.state = 471; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 43, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); } - this.state = 441; + this.state = 473; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 440; + this.state = 472; this.match(QuintParser.T__7); } } - this.state = 443; + this.state = 475; this.match(QuintParser.T__2); } break; @@ -1812,41 +1961,41 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 445; + this.state = 477; this.match(QuintParser.OR); - this.state = 446; + this.state = 478; this.match(QuintParser.T__1); - this.state = 447; + this.state = 479; this.expr(0); - this.state = 452; + this.state = 484; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 448; + this.state = 480; this.match(QuintParser.T__7); - this.state = 449; + this.state = 481; this.expr(0); } } } - this.state = 454; + this.state = 486; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 45, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); } - this.state = 456; + this.state = 488; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 455; + this.state = 487; this.match(QuintParser.T__7); } } - this.state = 458; + this.state = 490; this.match(QuintParser.T__2); } break; @@ -1856,7 +2005,7 @@ export class QuintParser extends Parser { _localctx = new MatchContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 460; + this.state = 492; this.matchSumExpr(); } break; @@ -1866,41 +2015,41 @@ export class QuintParser extends Parser { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 461; + this.state = 493; this.match(QuintParser.T__32); - this.state = 462; + this.state = 494; this.match(QuintParser.T__1); - this.state = 463; + this.state = 495; this.expr(0); - this.state = 468; + this.state = 500; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 464; + this.state = 496; this.match(QuintParser.T__7); - this.state = 465; + this.state = 497; this.expr(0); } } } - this.state = 470; + this.state = 502; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 47, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 51, this._ctx); } - this.state = 472; + this.state = 504; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 471; + this.state = 503; this.match(QuintParser.T__7); } } - this.state = 474; + this.state = 506; this.match(QuintParser.T__2); } break; @@ -1910,41 +2059,41 @@ export class QuintParser extends Parser { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 476; + this.state = 508; this.match(QuintParser.T__33); - this.state = 477; + this.state = 509; this.match(QuintParser.T__1); - this.state = 478; + this.state = 510; this.expr(0); - this.state = 483; + this.state = 515; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 479; + this.state = 511; this.match(QuintParser.T__7); - this.state = 480; + this.state = 512; this.expr(0); } } } - this.state = 485; + this.state = 517; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 49, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 53, this._ctx); } - this.state = 487; + this.state = 519; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 486; + this.state = 518; this.match(QuintParser.T__7); } } - this.state = 489; + this.state = 521; this.match(QuintParser.T__2); } break; @@ -1954,30 +2103,31 @@ export class QuintParser extends Parser { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 495; + this.state = 527; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 491; + this.state = 523; this.qualId(); } break; case QuintParser.INT: { - this.state = 492; + this.state = 524; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 493; + this.state = 525; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 494; + this.state = 526; this.match(QuintParser.STRING); } break; @@ -1992,181 +2142,181 @@ export class QuintParser extends Parser { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 497; + this.state = 529; this.match(QuintParser.LPAREN); - this.state = 498; + this.state = 530; this.expr(0); - this.state = 499; + this.state = 531; this.match(QuintParser.T__7); - this.state = 500; + this.state = 532; this.expr(0); - this.state = 505; + this.state = 537; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 501; + this.state = 533; this.match(QuintParser.T__7); - this.state = 502; + this.state = 534; this.expr(0); } } } - this.state = 507; + this.state = 539; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); } - this.state = 509; + this.state = 541; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 508; + this.state = 540; this.match(QuintParser.T__7); } } - this.state = 511; + this.state = 543; this.match(QuintParser.RPAREN); } break; case 12: + { + _localctx = new UnitContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 545; + this.match(QuintParser.LPAREN); + this.state = 546; + this.match(QuintParser.RPAREN); + } + break; + + case 13: { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 513; + this.state = 547; this.match(QuintParser.T__1); - this.state = 514; + this.state = 548; this.recElem(); - this.state = 519; + this.state = 553; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 515; + this.state = 549; this.match(QuintParser.T__7); - this.state = 516; + this.state = 550; this.recElem(); } } } - this.state = 521; + this.state = 555; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 54, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 58, this._ctx); } - this.state = 523; + this.state = 557; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 522; + this.state = 556; this.match(QuintParser.T__7); } } - this.state = 525; + this.state = 559; this.match(QuintParser.T__2); } break; - case 13: + case 14: { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 527; - this.match(QuintParser.T__25); - this.state = 536; + this.state = 561; + this.match(QuintParser.T__10); + this.state = 570; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 528; + this.state = 562; this.expr(0); - this.state = 533; + this.state = 567; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 529; + this.state = 563; this.match(QuintParser.T__7); - this.state = 530; + this.state = 564; this.expr(0); } } } - this.state = 535; + this.state = 569; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 56, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 60, this._ctx); } } } - this.state = 539; + this.state = 573; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 538; + this.state = 572; this.match(QuintParser.T__7); } } - this.state = 541; - this.match(QuintParser.T__26); + this.state = 575; + this.match(QuintParser.T__11); } break; - case 14: + case 15: { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 542; + this.state = 576; this.match(QuintParser.T__34); - this.state = 543; + this.state = 577; this.match(QuintParser.LPAREN); - this.state = 544; + this.state = 578; this.expr(0); - this.state = 545; + this.state = 579; this.match(QuintParser.RPAREN); - this.state = 546; + this.state = 580; this.expr(0); - this.state = 547; + this.state = 581; this.match(QuintParser.T__35); - this.state = 548; - this.expr(5); - } - break; - - case 15: - { - _localctx = new LetInContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; - this.state = 550; - this.operDef(); - this.state = 551; + this.state = 582; this.expr(4); } break; case 16: { - _localctx = new NondetContext(_localctx); + _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 553; - this.nondetOperDef(); - this.state = 554; + this.state = 584; + this.operDef(); + this.state = 585; this.expr(3); } break; @@ -2176,11 +2326,11 @@ export class QuintParser extends Parser { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 556; + this.state = 587; this.match(QuintParser.LPAREN); - this.state = 557; + this.state = 588; this.expr(0); - this.state = 558; + this.state = 589; this.match(QuintParser.RPAREN); } break; @@ -2190,19 +2340,19 @@ export class QuintParser extends Parser { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 560; + this.state = 591; this.match(QuintParser.T__1); - this.state = 561; + this.state = 592; this.expr(0); - this.state = 562; + this.state = 593; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 615; + this.state = 646; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -2210,20 +2360,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 613; + this.state = 644; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 66, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 566; + this.state = 597; if (!(this.precpred(this._ctx, 26))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); } - this.state = 567; + this.state = 598; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 568; + this.state = 599; this.expr(26); } break; @@ -2232,14 +2382,14 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 569; + this.state = 600; if (!(this.precpred(this._ctx, 24))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 570; + this.state = 601; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (QuintParser.MUL - 53)) | (1 << (QuintParser.DIV - 53)) | (1 << (QuintParser.MOD - 53)))) !== 0))) { + if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (QuintParser.MUL - 51)) | (1 << (QuintParser.DIV - 51)) | (1 << (QuintParser.MOD - 51)))) !== 0))) { (_localctx as MultDivContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2249,7 +2399,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 571; + this.state = 602; this.expr(25); } break; @@ -2258,11 +2408,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 572; + this.state = 603; if (!(this.precpred(this._ctx, 23))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 573; + this.state = 604; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2275,7 +2425,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 574; + this.state = 605; this.expr(24); } break; @@ -2284,14 +2434,14 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 575; + this.state = 606; if (!(this.precpred(this._ctx, 22))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); } - this.state = 576; + this.state = 607; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & ((1 << (QuintParser.GT - 56)) | (1 << (QuintParser.LT - 56)) | (1 << (QuintParser.GE - 56)) | (1 << (QuintParser.LE - 56)) | (1 << (QuintParser.NE - 56)) | (1 << (QuintParser.EQ - 56)))) !== 0))) { + if (!(((((_la - 54)) & ~0x1F) === 0 && ((1 << (_la - 54)) & ((1 << (QuintParser.GT - 54)) | (1 << (QuintParser.LT - 54)) | (1 << (QuintParser.GE - 54)) | (1 << (QuintParser.LE - 54)) | (1 << (QuintParser.NE - 54)) | (1 << (QuintParser.EQ - 54)))) !== 0))) { (_localctx as RelationsContext)._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -2301,7 +2451,7 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 577; + this.state = 608; this.expr(23); } break; @@ -2310,13 +2460,13 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 578; + this.state = 609; if (!(this.precpred(this._ctx, 20))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); } - this.state = 579; + this.state = 610; this.match(QuintParser.ASGN); - this.state = 580; + this.state = 611; this.expr(21); const m = "[QNT006] unexpected '=', did you mean '=='?" @@ -2329,13 +2479,13 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 583; + this.state = 614; if (!(this.precpred(this._ctx, 18))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); } - this.state = 584; + this.state = 615; this.match(QuintParser.AND); - this.state = 585; + this.state = 616; this.expr(19); } break; @@ -2344,13 +2494,13 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 586; + this.state = 617; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 587; + this.state = 618; this.match(QuintParser.OR); - this.state = 588; + this.state = 619; this.expr(17); } break; @@ -2359,13 +2509,13 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 589; + this.state = 620; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 590; + this.state = 621; this.match(QuintParser.IFF); - this.state = 591; + this.state = 622; this.expr(16); } break; @@ -2374,13 +2524,13 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 592; + this.state = 623; if (!(this.precpred(this._ctx, 14))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); } - this.state = 593; + this.state = 624; this.match(QuintParser.IMPLIES); - this.state = 594; + this.state = 625; this.expr(15); } break; @@ -2389,14 +2539,14 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 595; - if (!(this.precpred(this._ctx, 8))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); + this.state = 626; + if (!(this.precpred(this._ctx, 7))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 7)"); } - this.state = 596; - this.match(QuintParser.T__23); - this.state = 597; - this.expr(9); + this.state = 627; + this.match(QuintParser.T__25); + this.state = 628; + this.expr(8); } break; @@ -2404,32 +2554,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 598; + this.state = 629; if (!(this.precpred(this._ctx, 30))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); } - this.state = 599; - this.match(QuintParser.T__19); - this.state = 600; + this.state = 630; + this.match(QuintParser.T__21); + this.state = 631; this.nameAfterDot(); - this.state = 606; + this.state = 637; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 61, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 65, this._ctx) ) { case 1: { - this.state = 601; + this.state = 632; this.match(QuintParser.LPAREN); - this.state = 603; + this.state = 634; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__19))) !== 0) || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & ((1 << (QuintParser.T__32 - 33)) | (1 << (QuintParser.T__33 - 33)) | (1 << (QuintParser.T__34 - 33)) | (1 << (QuintParser.T__36 - 33)) | (1 << (QuintParser.STRING - 33)) | (1 << (QuintParser.BOOL - 33)) | (1 << (QuintParser.INT - 33)) | (1 << (QuintParser.AND - 33)) | (1 << (QuintParser.OR - 33)) | (1 << (QuintParser.IFF - 33)) | (1 << (QuintParser.IMPLIES - 33)) | (1 << (QuintParser.MAP - 33)) | (1 << (QuintParser.MATCH - 33)) | (1 << (QuintParser.MINUS - 33)) | (1 << (QuintParser.LPAREN - 33)) | (1 << (QuintParser.SET - 33)) | (1 << (QuintParser.LIST - 33)))) !== 0) || _la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID) { { - this.state = 602; + this.state = 633; this.argList(); } } - this.state = 605; + this.state = 636; this.match(QuintParser.RPAREN); } break; @@ -2441,24 +2591,24 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 608; + this.state = 639; if (!(this.precpred(this._ctx, 27))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 609; - this.match(QuintParser.T__25); - this.state = 610; + this.state = 640; + this.match(QuintParser.T__10); + this.state = 641; this.expr(0); - this.state = 611; - this.match(QuintParser.T__26); + this.state = 642; + this.match(QuintParser.T__11); } break; } } } - this.state = 617; + this.state = 648; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 63, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); } } } @@ -2479,48 +2629,48 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumExpr(): MatchSumExprContext { let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); - this.enterRule(_localctx, 40, QuintParser.RULE_matchSumExpr); + this.enterRule(_localctx, 44, QuintParser.RULE_matchSumExpr); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 618; + this.state = 649; this.match(QuintParser.MATCH); - this.state = 619; + this.state = 650; this.expr(0); - this.state = 620; + this.state = 651; this.match(QuintParser.T__1); - this.state = 622; + this.state = 653; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === QuintParser.T__10) { + if (_la === QuintParser.T__12) { { - this.state = 621; - this.match(QuintParser.T__10); + this.state = 652; + this.match(QuintParser.T__12); } } - this.state = 624; + this.state = 655; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); - this.state = 629; + this.state = 660; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === QuintParser.T__10) { + while (_la === QuintParser.T__12) { { { - this.state = 625; - this.match(QuintParser.T__10); - this.state = 626; + this.state = 656; + this.match(QuintParser.T__12); + this.state = 657; _localctx._matchSumCase = this.matchSumCase(); _localctx._matchCase.push(_localctx._matchSumCase); } } - this.state = 631; + this.state = 662; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 632; + this.state = 663; this.match(QuintParser.T__2); } } @@ -2541,31 +2691,32 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumCase(): MatchSumCaseContext { let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_matchSumCase); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumCase); try { this.enterOuterAlt(_localctx, 1); { - this.state = 636; + this.state = 667; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 634; + this.state = 665; _localctx._variantMatch = this.matchSumVariant(); } break; case QuintParser.T__36: { - this.state = 635; + this.state = 666; _localctx._wildCardMatch = this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 638; - this.match(QuintParser.T__24); - this.state = 639; + this.state = 669; + this.match(QuintParser.T__26); + this.state = 670; this.expr(0); } } @@ -2586,41 +2737,42 @@ export class QuintParser extends Parser { // @RuleVersion(0) public matchSumVariant(): MatchSumVariantContext { let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); - this.enterRule(_localctx, 44, QuintParser.RULE_matchSumVariant); + this.enterRule(_localctx, 48, QuintParser.RULE_matchSumVariant); let _la: number; try { this.enterOuterAlt(_localctx, 1); { { - this.state = 641; + this.state = 672; _localctx._variantLabel = this.simpleId("variant label"); } - this.state = 648; + this.state = 679; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 642; + this.state = 673; this.match(QuintParser.LPAREN); - this.state = 645; + this.state = 676; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: { - this.state = 643; + this.state = 674; _localctx._variantParam = this.simpleId("match case parameter"); } break; case QuintParser.T__36: { - this.state = 644; + this.state = 675; this.match(QuintParser.T__36); } break; default: throw new NoViableAltException(this); } - this.state = 647; + this.state = 678; this.match(QuintParser.RPAREN); } } @@ -2644,17 +2796,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public declarationOrExpr(): DeclarationOrExprContext { let _localctx: DeclarationOrExprContext = new DeclarationOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_declarationOrExpr); + this.enterRule(_localctx, 50, QuintParser.RULE_declarationOrExpr); try { - this.state = 659; + this.state = 690; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 69, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 650; + this.state = 681; this.declaration(); - this.state = 651; + this.state = 682; this.match(QuintParser.EOF); } break; @@ -2662,9 +2814,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 653; + this.state = 684; this.expr(0); - this.state = 654; + this.state = 685; this.match(QuintParser.EOF); } break; @@ -2672,9 +2824,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 656; + this.state = 687; this.match(QuintParser.DOCCOMMENT); - this.state = 657; + this.state = 688; this.match(QuintParser.EOF); } break; @@ -2682,7 +2834,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 658; + this.state = 689; this.match(QuintParser.EOF); } break; @@ -2705,15 +2857,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_lambda); + this.enterRule(_localctx, 52, QuintParser.RULE_lambda); try { - this.state = 663; + this.state = 694; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 70, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 74, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 661; + this.state = 692; this.lambdaUnsugared(); } break; @@ -2721,7 +2873,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 662; + this.state = 693; this.lambdaTupleSugar(); } break; @@ -2744,52 +2896,53 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaUnsugared(): LambdaUnsugaredContext { let _localctx: LambdaUnsugaredContext = new LambdaUnsugaredContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_lambdaUnsugared); + this.enterRule(_localctx, 54, QuintParser.RULE_lambdaUnsugared); let _la: number; try { - this.state = 682; + this.state = 713; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 665; + this.state = 696; this.parameter(); - this.state = 666; - this.match(QuintParser.T__24); - this.state = 667; + this.state = 697; + this.match(QuintParser.T__26); + this.state = 698; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 669; + this.state = 700; this.match(QuintParser.LPAREN); - this.state = 670; + this.state = 701; this.parameter(); - this.state = 675; + this.state = 706; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 671; + this.state = 702; this.match(QuintParser.T__7); - this.state = 672; + this.state = 703; this.parameter(); } } - this.state = 677; + this.state = 708; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 678; + this.state = 709; this.match(QuintParser.RPAREN); - this.state = 679; - this.match(QuintParser.T__24); - this.state = 680; + this.state = 710; + this.match(QuintParser.T__26); + this.state = 711; this.expr(0); } break; @@ -2814,40 +2967,40 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambdaTupleSugar(): LambdaTupleSugarContext { let _localctx: LambdaTupleSugarContext = new LambdaTupleSugarContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_lambdaTupleSugar); + this.enterRule(_localctx, 56, QuintParser.RULE_lambdaTupleSugar); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 684; + this.state = 715; this.match(QuintParser.LPAREN); - this.state = 685; + this.state = 716; this.match(QuintParser.LPAREN); - this.state = 686; + this.state = 717; this.parameter(); - this.state = 689; + this.state = 720; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 687; + this.state = 718; this.match(QuintParser.T__7); - this.state = 688; + this.state = 719; this.parameter(); } } - this.state = 691; + this.state = 722; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__7); - this.state = 693; + this.state = 724; this.match(QuintParser.RPAREN); - this.state = 694; + this.state = 725; this.match(QuintParser.RPAREN); - this.state = 695; - this.match(QuintParser.T__24); - this.state = 696; + this.state = 726; + this.match(QuintParser.T__26); + this.state = 727; this.expr(0); } } @@ -2868,22 +3021,23 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 58, QuintParser.RULE_identOrHole); try { - this.state = 700; + this.state = 731; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 698; + this.state = 729; this.match(QuintParser.T__36); } break; - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 699; + this.state = 730; this.qualId(); } break; @@ -2908,12 +3062,41 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_parameter); + this.enterRule(_localctx, 60, QuintParser.RULE_parameter); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 733; + _localctx._paramName = this.identOrHole(); + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } + // @RuleVersion(0) + public annotatedParameter(): AnnotatedParameterContext { + let _localctx: AnnotatedParameterContext = new AnnotatedParameterContext(this._ctx, this.state); + this.enterRule(_localctx, 62, QuintParser.RULE_annotatedParameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 702; - this.identOrHole(); + this.state = 735; + _localctx._paramName = this.identOrHole(); + this.state = 736; + this.match(QuintParser.T__4); + this.state = 737; + this.type(0); } } catch (re) { @@ -2933,22 +3116,23 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 64, QuintParser.RULE_identOrStar); try { - this.state = 706; + this.state = 741; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 704; + this.state = 739; this.match(QuintParser.MUL); } break; - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 2); { - this.state = 705; + this.state = 740; this.qualId(); } break; @@ -2973,26 +3157,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_argList); + this.enterRule(_localctx, 66, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 708; + this.state = 743; this.expr(0); - this.state = 713; + this.state = 748; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 709; + this.state = 744; this.match(QuintParser.T__7); - this.state = 710; + this.state = 745; this.expr(0); } } - this.state = 715; + this.state = 750; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -3015,28 +3199,29 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_recElem); + this.enterRule(_localctx, 68, QuintParser.RULE_recElem); try { - this.state = 722; + this.state = 757; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 716; + this.state = 751; this.simpleId("record"); - this.state = 717; + this.state = 752; this.match(QuintParser.T__4); - this.state = 718; + this.state = 753; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 720; + this.state = 755; this.match(QuintParser.T__37); - this.state = 721; + this.state = 756; this.expr(0); } break; @@ -3061,16 +3246,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 70, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 726; + this.state = 761; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 724; + this.state = 759; this.qualId(); } break; @@ -3078,15 +3264,15 @@ export class QuintParser extends Parser { case QuintParser.OR: case QuintParser.IFF: case QuintParser.IMPLIES: + case QuintParser.MAP: case QuintParser.SET: case QuintParser.LIST: - case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 725; + this.state = 760; _localctx._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)) | (1 << (QuintParser.MAP - 43)))) !== 0))) { + if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.MAP - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)))) !== 0))) { _localctx._op = this._errHandler.recoverInline(this); } else { if (this._input.LA(1) === Token.EOF) { @@ -3119,16 +3305,17 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 66, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 72, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 730; + this.state = 765; this._errHandler.sync(this); switch (this._input.LA(1)) { - case QuintParser.IDENTIFIER: + case QuintParser.LOW_ID: + case QuintParser.CAP_ID: this.enterOuterAlt(_localctx, 1); { - this.state = 728; + this.state = 763; this.qualId(); } break; @@ -3138,7 +3325,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 729; + this.state = 764; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3174,12 +3361,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 68, QuintParser.RULE_operator); + this.enterRule(_localctx, 74, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 732; + this.state = 767; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3210,12 +3397,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 70, QuintParser.RULE_literal); + this.enterRule(_localctx, 76, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 734; + this.state = 769; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3246,30 +3433,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 72, QuintParser.RULE_qualId); + this.enterRule(_localctx, 78, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 736; - this.match(QuintParser.IDENTIFIER); - this.state = 741; + this.state = 771; + this.identifier(); + this.state = 776; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 84, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 737; + this.state = 772; this.match(QuintParser.T__38); - this.state = 738; - this.match(QuintParser.IDENTIFIER); + this.state = 773; + this.identifier(); } } } - this.state = 743; + this.state = 778; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 80, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 84, this._ctx); } } } @@ -3290,23 +3477,23 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 74, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 80, QuintParser.RULE_simpleId); try { - this.state = 748; + this.state = 783; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 81, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 85, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 744; - this.match(QuintParser.IDENTIFIER); + this.state = 779; + this.identifier(); } break; case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 745; + this.state = 780; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3334,13 +3521,49 @@ export class QuintParser extends Parser { } return _localctx; } + // @RuleVersion(0) + public identifier(): IdentifierContext { + let _localctx: IdentifierContext = new IdentifierContext(this._ctx, this.state); + this.enterRule(_localctx, 82, QuintParser.RULE_identifier); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 785; + _la = this._input.LA(1); + if (!(_la === QuintParser.LOW_ID || _la === QuintParser.CAP_ID)) { + this._errHandler.recoverInline(this); + } else { + if (this._input.LA(1) === Token.EOF) { + this.matchedEOF = true; + } + + this._errHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return _localctx; + } public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 16: + case 17: return this.type_sempred(_localctx as TypeContext, predIndex); - case 19: + case 21: return this.expr_sempred(_localctx as ExprContext, predIndex); } return true; @@ -3348,10 +3571,10 @@ export class QuintParser extends Parser { private type_sempred(_localctx: TypeContext, predIndex: number): boolean { switch (predIndex) { case 0: - return this.precpred(this._ctx, 12); + return this.precpred(this._ctx, 15); case 1: - return this.precpred(this._ctx, 11); + return this.precpred(this._ctx, 14); } return true; } @@ -3385,7 +3608,7 @@ export class QuintParser extends Parser { return this.precpred(this._ctx, 14); case 11: - return this.precpred(this._ctx, 8); + return this.precpred(this._ctx, 7); case 12: return this.precpred(this._ctx, 30); @@ -3398,403 +3621,423 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03G\u02F1\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03H\u0316\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x04\x07" + "\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r\t\r\x04" + "\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t\x12\x04" + "\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x04\x17\t\x17\x04" + "\x18\t\x18\x04\x19\t\x19\x04\x1A\t\x1A\x04\x1B\t\x1B\x04\x1C\t\x1C\x04" + "\x1D\t\x1D\x04\x1E\t\x1E\x04\x1F\t\x1F\x04 \t \x04!\t!\x04\"\t\"\x04#" + - "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x03\x02\x06\x02P\n\x02\r\x02\x0E" + - "\x02Q\x03\x02\x03\x02\x03\x03\x07\x03W\n\x03\f\x03\x0E\x03Z\v\x03\x03" + - "\x03\x03\x03\x03\x03\x03\x03\x07\x03`\n\x03\f\x03\x0E\x03c\v\x03\x03\x03" + - "\x03\x03\x03\x04\x07\x04h\n\x04\f\x04\x0E\x04k\v\x04\x03\x04\x03\x04\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x05\x05\x83\n\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x07\x06\x8B\n\x06\f\x06\x0E\x06\x8E\v\x06\x05\x06\x90\n\x06\x03" + - "\x06\x03\x06\x03\x06\x05\x06\x95\n\x06\x03\x06\x03\x06\x03\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\xA2\n" + - "\x06\f\x06\x0E\x06\xA5\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xAB" + - "\n\x06\x03\x06\x03\x06\x05\x06\xAF\n\x06\x03\x06\x05\x06\xB2\n\x06\x03" + + "\t#\x04$\t$\x04%\t%\x04&\t&\x04\'\t\'\x04(\t(\x04)\t)\x04*\t*\x04+\t+" + + "\x03\x02\x06\x02X\n\x02\r\x02\x0E\x02Y\x03\x02\x03\x02\x03\x03\x07\x03" + + "_\n\x03\f\x03\x0E\x03b\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03h" + + "\n\x03\f\x03\x0E\x03k\v\x03\x03\x03\x03\x03\x03\x04\x07\x04p\n\x04\f\x04" + + "\x0E\x04s\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05\x8B\n\x05\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x93\n\x06\f\x06\x0E" + + "\x06\x96\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\x9D\n\x06" + + "\x03\x06\x05\x06\xA0\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x07\x06\xA8\n\x06\f\x06\x0E\x06\xAB\v\x06\x05\x06\xAD\n\x06\x03\x06" + + "\x05\x06\xB0\n\x06\x03\x06\x03\x06\x05\x06\xB4\n\x06\x03\x06\x03\x06\x05" + + "\x06\xB8\n\x06\x03\x06\x05\x06\xBB\n\x06\x05\x06\xBD\n\x06\x03\x07\x03" + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03" + - "\x07\x03\x07\x05\x07\xBF\n\x07\x03\x07\x03\x07\x03\x07\x07\x07\xC4\n\x07" + - "\f\x07\x0E\x07\xC7\v\x07\x05\x07\xC9\n\x07\x03\b\x03\b\x03\b\x03\b\x03" + - "\b\x05\b\xD0\n\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD6\n\t\x03\t\x03\t\x03" + - "\t\x05\t\xDB\n\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n" + - "\x05\n\xE6\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xEE\n\v\x03\v" + - "\x03\v\x03\v\x03\v\x05\v\xF4\n\v\x03\v\x03\v\x05\v\xF8\n\v\x05\v\xFA\n" + - "\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0105\n" + - "\f\x05\f\u0107\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x07\r\u0114\n\r\f\r\x0E\r\u0117\v\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x05\r\u011E\n\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x03\r\x07\r\u012B\n\r\f\r\x0E\r\u012E\v\r\x03\r\x03\r\x03" + - "\r\x03\r\x03\r\x05\r\u0135\n\r\x05\r\u0137\n\r\x03\x0E\x03\x0E\x03\x0F" + - "\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x07\x12\u0146\n\x12\f\x12\x0E\x12\u0149\v\x12\x05\x12\u014B\n" + - "\x12\x03\x12\x05\x12\u014E\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0163\n\x12\f\x12\x0E" + - "\x12\u0166\v\x12\x03\x12\x05\x12\u0169\n\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x05\x12\u0179\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x07\x12\u0181\n\x12\f\x12\x0E\x12\u0184\v\x12\x03\x13\x03\x13" + - "\x03\x13\x03\x13\x03\x13\x07\x13\u018B\n\x13\f\x13\x0E\x13\u018E\v\x13" + - "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u0197" + - "\n\x13\x05\x13\u0199\n\x13\x03\x13\x03\x13\x05\x13\u019D\n\x13\x03\x14" + - "\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01A6\n\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B6\n\x15\f\x15\x0E\x15" + - "\u01B9\v\x15\x03\x15\x05\x15\u01BC\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x07\x15\u01C5\n\x15\f\x15\x0E\x15\u01C8\v\x15" + - "\x03\x15\x05\x15\u01CB\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x07\x15\u01D5\n\x15\f\x15\x0E\x15\u01D8\v\x15\x03" + - "\x15\x05\x15\u01DB\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x07\x15\u01E4\n\x15\f\x15\x0E\x15\u01E7\v\x15\x03\x15\x05\x15" + - "\u01EA\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01F2" + - "\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01FA\n" + - "\x15\f\x15\x0E\x15\u01FD\v\x15\x03\x15\x05\x15\u0200\n\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0208\n\x15\f\x15\x0E\x15" + - "\u020B\v\x15\x03\x15\x05\x15\u020E\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x07\x15\u0216\n\x15\f\x15\x0E\x15\u0219\v\x15\x05\x15" + - "\u021B\n\x15\x03\x15\x05\x15\u021E\n\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15" + - "\x03\x15\x05\x15\u0237\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x03\x15\x03\x15\x03\x15\x03\x15\x05\x15\u025E\n\x15\x03\x15\x05\x15" + - "\u0261\n\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x07\x15\u0268\n\x15" + - "\f\x15\x0E\x15\u026B\v\x15\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u0271" + - "\n\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0276\n\x16\f\x16\x0E\x16\u0279" + - "\v\x16\x03\x16\x03\x16\x03\x17\x03\x17\x05\x17\u027F\n\x17\x03\x17\x03" + - "\x17\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u0288\n\x18\x03\x18" + - "\x05\x18\u028B\n\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x05\x19\u0296\n\x19\x03\x1A\x03\x1A\x05\x1A\u029A" + - "\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" + - "\x07\x1B\u02A4\n\x1B\f\x1B\x0E\x1B\u02A7\v\x1B\x03\x1B\x03\x1B\x03\x1B" + - "\x03\x1B\x05\x1B\u02AD\n\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x06" + - "\x1C\u02B4\n\x1C\r\x1C\x0E\x1C\u02B5\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1D\x03\x1D\x05\x1D\u02BF\n\x1D\x03\x1E\x03\x1E\x03\x1F\x03\x1F" + - "\x05\x1F\u02C5\n\x1F\x03 \x03 \x03 \x07 \u02CA\n \f \x0E \u02CD\v \x03" + - "!\x03!\x03!\x03!\x03!\x03!\x05!\u02D5\n!\x03\"\x03\"\x05\"\u02D9\n\"\x03" + - "#\x03#\x05#\u02DD\n#\x03$\x03$\x03%\x03%\x03&\x03&\x03&\x07&\u02E6\n&" + - "\f&\x0E&\u02E9\v&\x03\'\x03\'\x03\'\x03\'\x05\'\u02EF\n\'\x03\'\x02\x02" + - "\x04\"((\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12" + - "\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&" + - "\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" + - "B\x02D\x02F\x02H\x02J\x02L\x02\x02\t\x03\x0279\x03\x0256\x03\x02:?\x03" + - "\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*,\x02\u0351\x02O\x03\x02\x02\x02" + - "\x04X\x03\x02\x02\x02\x06i\x03\x02\x02\x02\b\x82\x03\x02\x02\x02\n\x84" + - "\x03\x02\x02\x02\f\xC8\x03\x02\x02\x02\x0E\xCA\x03\x02\x02\x02\x10\xD1" + - "\x03\x02\x02\x02\x12\xE5\x03\x02\x02\x02\x14\xF9\x03\x02\x02\x02\x16\u0106" + - "\x03\x02\x02\x02\x18\u0136\x03\x02\x02\x02\x1A\u0138\x03\x02\x02\x02\x1C" + - "\u013A\x03\x02\x02\x02\x1E\u013C\x03\x02\x02\x02 \u013E\x03\x02\x02\x02" + - "\"\u0178\x03\x02\x02\x02$\u019C\x03\x02\x02\x02&\u019E\x03\x02\x02\x02" + - "(\u0236\x03\x02\x02\x02*\u026C\x03\x02\x02\x02,\u027E\x03\x02\x02\x02" + - ".\u0283\x03\x02\x02\x020\u0295\x03\x02\x02\x022\u0299\x03\x02\x02\x02" + - "4\u02AC\x03\x02\x02\x026\u02AE\x03\x02\x02\x028\u02BE\x03\x02\x02\x02" + - ":\u02C0\x03\x02\x02\x02<\u02C4\x03\x02\x02\x02>\u02C6\x03\x02\x02\x02" + - "@\u02D4\x03\x02\x02\x02B\u02D8\x03\x02\x02\x02D\u02DC\x03\x02\x02\x02" + - "F\u02DE\x03\x02\x02\x02H\u02E0\x03\x02\x02\x02J\u02E2\x03\x02\x02\x02" + - "L\u02EE\x03\x02\x02\x02NP\x05\x04\x03\x02ON\x03\x02\x02\x02PQ\x03\x02" + - "\x02\x02QO\x03\x02\x02\x02QR\x03\x02\x02\x02RS\x03\x02\x02\x02ST\x07\x02" + - "\x02\x03T\x03\x03\x02\x02\x02UW\x07D\x02\x02VU\x03\x02\x02\x02WZ\x03\x02" + - "\x02\x02XV\x03\x02\x02\x02XY\x03\x02\x02\x02Y[\x03\x02\x02\x02ZX\x03\x02" + - "\x02\x02[\\\x07\x03\x02\x02\\]\x05J&\x02]a\x07\x04\x02\x02^`\x05\x06\x04" + - "\x02_^\x03\x02\x02\x02`c\x03\x02\x02\x02a_\x03\x02\x02\x02ab\x03\x02\x02" + - "\x02bd\x03\x02\x02\x02ca\x03\x02\x02\x02de\x07\x05\x02\x02e\x05\x03\x02" + - "\x02\x02fh\x07D\x02\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02ig\x03\x02" + - "\x02\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02lm\x05\b" + - "\x05\x02m\x07\x03\x02\x02\x02no\x07\x06\x02\x02op\x05J&\x02pq\x07\x07" + - "\x02\x02qr\x05\"\x12\x02r\x83\x03\x02\x02\x02st\x07\b\x02\x02tu\x05J&" + - "\x02uv\x07\x07\x02\x02vw\x05\"\x12\x02w\x83\x03\x02\x02\x02xy\x07\t\x02" + - "\x02yz\x058\x1D\x02z{\x07@\x02\x02{|\x05(\x15\x02|\x83\x03\x02\x02\x02" + - "}\x83\x05\x18\r\x02~\x83\x05\n\x06\x02\x7F\x83\x05\f\x07\x02\x80\x83\x05" + - "\x14\v\x02\x81\x83\x05\x16\f\x02\x82n\x03\x02\x02\x02\x82s\x03\x02\x02" + - "\x02\x82x\x03\x02\x02\x02\x82}\x03\x02\x02\x02\x82~\x03\x02\x02\x02\x82" + - "\x7F\x03\x02\x02\x02\x82\x80\x03\x02\x02\x02\x82\x81\x03\x02\x02\x02\x83" + - "\t\x03\x02\x02\x02\x84\x85\x05\x12\n\x02\x85\xAA\x05B\"\x02\x86\x8F\x07" + - "A\x02\x02\x87\x8C\x05:\x1E\x02\x88\x89\x07\n\x02\x02\x89\x8B\x05:\x1E" + - "\x02\x8A\x88\x03\x02\x02\x02\x8B\x8E\x03\x02\x02\x02\x8C\x8A\x03\x02\x02" + - "\x02\x8C\x8D\x03\x02\x02\x02\x8D\x90\x03\x02\x02\x02\x8E\x8C\x03\x02\x02" + - "\x02\x8F\x87\x03\x02\x02\x02\x8F\x90\x03\x02\x02\x02\x90\x91\x03\x02\x02" + - "\x02\x91\x94\x07B\x02\x02\x92\x93\x07\x07\x02\x02\x93\x95\x05\"\x12\x02" + - "\x94\x92\x03\x02\x02\x02\x94\x95\x03\x02\x02\x02\x95\xAB\x03\x02\x02\x02" + - "\x96\x97\x07\x07\x02\x02\x97\xAB\x05\"\x12\x02\x98\x99\x07A\x02\x02\x99" + - "\x9A\x05:\x1E\x02\x9A\x9B\x07\x07\x02\x02\x9B\xA3\x05\"\x12\x02\x9C\x9D" + - "\x07\n\x02\x02\x9D\x9E\x05:\x1E\x02\x9E\x9F\x07\x07\x02\x02\x9F\xA0\x05" + - "\"\x12\x02\xA0\xA2\x03\x02\x02\x02\xA1\x9C\x03\x02\x02\x02\xA2\xA5\x03" + - "\x02\x02\x02\xA3\xA1\x03\x02\x02\x02\xA3\xA4\x03\x02\x02\x02\xA4\xA6\x03" + - "\x02\x02\x02\xA5\xA3\x03\x02\x02\x02\xA6\xA7\x07B\x02\x02\xA7\xA8\x07" + - "\x07\x02\x02\xA8\xA9\x05\"\x12\x02\xA9\xAB\x03\x02\x02\x02\xAA\x86\x03" + - "\x02\x02\x02\xAA\x96\x03\x02\x02\x02\xAA\x98\x03\x02\x02\x02\xAA\xAB\x03" + - "\x02\x02\x02\xAB\xAE\x03\x02\x02\x02\xAC\xAD\x07@\x02\x02\xAD\xAF\x05" + - "(\x15\x02\xAE\xAC\x03\x02\x02\x02\xAE\xAF\x03\x02\x02\x02\xAF\xB1\x03" + - "\x02\x02\x02\xB0\xB2\x07\v\x02\x02\xB1\xB0\x03\x02\x02\x02\xB1\xB2\x03" + - "\x02\x02\x02\xB2\v\x03\x02\x02\x02\xB3\xB4\x07\f\x02\x02\xB4\xC9\x05J" + - "&\x02\xB5\xB6\x07\f\x02\x02\xB6\xB7\x05J&\x02\xB7\xB8\x07@\x02\x02\xB8" + - "\xB9\x05\"\x12\x02\xB9\xC9\x03\x02\x02\x02\xBA\xBB\x07\f\x02\x02\xBB\xBC" + - "\x05J&\x02\xBC\xBE\x07@\x02\x02\xBD\xBF\x07\r\x02\x02\xBE\xBD\x03\x02" + - "\x02\x02\xBE\xBF\x03\x02\x02\x02\xBF\xC0\x03\x02\x02\x02\xC0\xC5\x05\x0E" + - "\b\x02\xC1\xC2\x07\r\x02\x02\xC2\xC4\x05\x0E\b\x02\xC3\xC1\x03\x02\x02" + - "\x02\xC4\xC7\x03\x02\x02\x02\xC5\xC3\x03\x02\x02\x02\xC5\xC6\x03\x02\x02" + - "\x02\xC6\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC8\xB3\x03\x02\x02" + - "\x02\xC8\xB5\x03\x02\x02\x02\xC8\xBA\x03\x02\x02\x02\xC9\r\x03\x02\x02" + - "\x02\xCA\xCF\x05L\'\x02\xCB\xCC\x07A\x02\x02\xCC\xCD\x05\"\x12\x02\xCD" + - "\xCE\x07B\x02\x02\xCE\xD0\x03\x02\x02\x02\xCF\xCB\x03\x02\x02\x02\xCF" + - "\xD0\x03\x02\x02\x02\xD0\x0F\x03\x02\x02\x02\xD1\xD2\x07\x0E\x02\x02\xD2" + - "\xD5\x05J&\x02\xD3\xD4\x07\x07\x02\x02\xD4\xD6\x05\"\x12\x02\xD5\xD3\x03" + - "\x02\x02\x02\xD5\xD6\x03\x02\x02\x02\xD6\xD7\x03\x02\x02\x02\xD7\xD8\x07" + - "@\x02\x02\xD8\xDA\x05(\x15\x02\xD9\xDB\x07\v\x02\x02\xDA\xD9\x03\x02\x02" + - "\x02\xDA\xDB\x03\x02\x02\x02\xDB\x11\x03\x02\x02\x02\xDC\xE6\x07\x0F\x02" + - "\x02\xDD\xE6\x07\x10\x02\x02\xDE\xDF\x07\x11\x02\x02\xDF\xE6\x07\x0F\x02" + - "\x02\xE0\xE1\x07\x11\x02\x02\xE1\xE6\x07\x10\x02\x02\xE2\xE6\x07\x12\x02" + - "\x02\xE3\xE6\x07\x13\x02\x02\xE4\xE6\x07\x14\x02\x02\xE5\xDC\x03\x02\x02" + - "\x02\xE5\xDD\x03\x02\x02\x02\xE5\xDE\x03\x02\x02\x02\xE5\xE0\x03\x02\x02" + - "\x02\xE5\xE2\x03\x02\x02\x02\xE5\xE3\x03\x02\x02\x02\xE5\xE4\x03\x02\x02" + - "\x02\xE6\x13\x03\x02\x02\x02\xE7\xE8\x07\x15\x02\x02\xE8\xE9\x05\x1C\x0F" + - "\x02\xE9\xEA\x07\x16\x02\x02\xEA\xED\x05<\x1F\x02\xEB\xEC\x07\x17\x02" + - "\x02\xEC\xEE\x05 \x11\x02\xED\xEB\x03\x02\x02\x02\xED\xEE\x03\x02\x02" + - "\x02\xEE\xFA\x03\x02\x02\x02\xEF\xF0\x07\x15\x02\x02\xF0\xF3\x05\x1C\x0F" + - "\x02\xF1\xF2\x07\x18\x02\x02\xF2\xF4\x05\x1C\x0F\x02\xF3\xF1\x03\x02\x02" + - "\x02\xF3\xF4\x03\x02\x02\x02\xF4\xF7\x03\x02\x02\x02\xF5\xF6\x07\x17\x02" + - "\x02\xF6\xF8\x05 \x11\x02\xF7\xF5\x03\x02\x02\x02\xF7\xF8\x03\x02\x02" + - "\x02\xF8\xFA\x03\x02\x02\x02\xF9\xE7\x03\x02\x02\x02\xF9\xEF\x03\x02\x02" + - "\x02\xFA\x15\x03\x02\x02\x02\xFB\xFC\x07\x19\x02\x02\xFC\xFD\x05\x1C\x0F" + - "\x02\xFD\xFE\x07\x16\x02\x02\xFE\xFF\x05<\x1F\x02\xFF\u0107\x03\x02\x02" + - "\x02\u0100\u0101\x07\x19\x02\x02\u0101\u0104\x05\x1C\x0F\x02\u0102\u0103" + - "\x07\x18\x02\x02\u0103\u0105\x05\x1C\x0F\x02\u0104\u0102\x03\x02\x02\x02" + - "\u0104\u0105\x03\x02\x02\x02\u0105\u0107\x03\x02\x02\x02\u0106\xFB\x03" + - "\x02\x02\x02\u0106\u0100\x03\x02\x02\x02\u0107\x17\x03\x02\x02\x02\u0108" + - "\u0109\x07\x15\x02\x02\u0109\u010A\x05\x1A\x0E\x02\u010A\u010B\x07A\x02" + - "\x02\u010B\u010C\x05\x1C\x0F\x02\u010C\u010D\x07@\x02\x02\u010D\u0115" + - "\x05(\x15\x02\u010E\u010F\x07\n\x02\x02\u010F\u0110\x05\x1C\x0F\x02\u0110" + - "\u0111\x07@\x02\x02\u0111\u0112\x05(\x15\x02\u0112\u0114\x03\x02\x02\x02" + - "\u0113\u010E\x03\x02\x02\x02\u0114\u0117\x03\x02\x02\x02\u0115\u0113\x03" + - "\x02\x02\x02\u0115\u0116\x03\x02\x02\x02\u0116\u0118\x03\x02\x02\x02\u0117" + - "\u0115\x03\x02\x02\x02\u0118\u0119\x07B\x02\x02\u0119\u011A\x07\x16\x02" + - "\x02\u011A\u011D\x077\x02\x02\u011B\u011C\x07\x17\x02\x02\u011C\u011E" + - "\x05 \x11\x02\u011D\u011B\x03\x02\x02\x02\u011D\u011E\x03\x02\x02\x02" + - "\u011E\u0137\x03\x02\x02\x02\u011F\u0120\x07\x15\x02\x02\u0120\u0121\x05" + - "\x1A\x0E\x02\u0121\u0122\x07A\x02\x02\u0122\u0123\x05\x1C\x0F\x02\u0123" + - "\u0124\x07@\x02\x02\u0124\u012C\x05(\x15\x02\u0125\u0126\x07\n\x02\x02" + - "\u0126\u0127\x05\x1C\x0F\x02\u0127\u0128\x07@\x02\x02\u0128\u0129\x05" + - "(\x15\x02\u0129\u012B\x03\x02\x02\x02\u012A\u0125\x03\x02\x02\x02\u012B" + - "\u012E\x03\x02\x02\x02\u012C\u012A\x03\x02\x02\x02\u012C\u012D\x03\x02" + - "\x02\x02\u012D\u012F\x03\x02\x02\x02\u012E\u012C\x03\x02\x02\x02\u012F" + - "\u0130\x07B\x02\x02\u0130\u0131\x07\x18\x02\x02\u0131\u0134\x05\x1E\x10" + - "\x02\u0132\u0133\x07\x17\x02\x02\u0133\u0135\x05 \x11\x02\u0134\u0132" + - "\x03\x02\x02\x02\u0134\u0135\x03\x02\x02\x02\u0135\u0137\x03\x02\x02\x02" + - "\u0136\u0108\x03\x02\x02\x02\u0136\u011F\x03\x02\x02\x02\u0137\x19\x03" + - "\x02\x02\x02\u0138\u0139\x05J&\x02\u0139\x1B\x03\x02\x02\x02\u013A\u013B" + - "\x05J&\x02\u013B\x1D\x03\x02\x02\x02\u013C\u013D\x05J&\x02\u013D\x1F\x03" + - "\x02\x02\x02\u013E\u013F\x07*\x02\x02\u013F!\x03\x02\x02\x02\u0140\u0141" + - "\b\x12\x01\x02\u0141\u014A\x07A\x02\x02\u0142\u0147\x05\"\x12\x02\u0143" + - "\u0144\x07\n\x02\x02\u0144\u0146\x05\"\x12\x02\u0145\u0143\x03\x02\x02" + - "\x02\u0146\u0149\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0147\u0148" + - "\x03\x02\x02\x02\u0148\u014B\x03\x02\x02\x02\u0149\u0147\x03\x02\x02\x02" + - "\u014A\u0142\x03\x02\x02\x02\u014A\u014B\x03\x02\x02\x02\u014B\u014D\x03" + - "\x02\x02\x02\u014C\u014E\x07\n\x02\x02\u014D\u014C\x03\x02\x02\x02\u014D" + - "\u014E\x03\x02\x02\x02\u014E\u014F\x03\x02\x02\x02\u014F\u0150\x07B\x02" + - "\x02\u0150\u0151\x07\x1B\x02\x02\u0151\u0179\x05\"\x12\f\u0152\u0153\x07" + - "1\x02\x02\u0153\u0154\x07\x1C\x02\x02\u0154\u0155\x05\"\x12\x02\u0155" + - "\u0156\x07\x1D\x02\x02\u0156\u0179\x03\x02\x02\x02\u0157\u0158\x072\x02" + - "\x02\u0158\u0159\x07\x1C\x02\x02\u0159\u015A\x05\"\x12\x02\u015A\u015B" + - "\x07\x1D\x02\x02\u015B\u0179\x03\x02\x02\x02\u015C\u015D\x07A\x02\x02" + - "\u015D\u015E\x05\"\x12\x02\u015E\u015F\x07\n\x02\x02\u015F\u0164\x05\"" + - "\x12\x02\u0160\u0161\x07\n\x02\x02\u0161\u0163\x05\"\x12\x02\u0162\u0160" + - "\x03\x02\x02\x02\u0163\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02" + - "\u0164\u0165\x03\x02\x02\x02\u0165\u0168\x03\x02\x02\x02\u0166\u0164\x03" + - "\x02\x02\x02\u0167\u0169\x07\n\x02\x02\u0168\u0167\x03\x02\x02\x02\u0168" + - "\u0169\x03\x02\x02\x02\u0169\u016A\x03\x02\x02\x02\u016A\u016B\x07B\x02" + - "\x02\u016B\u0179\x03\x02\x02\x02\u016C\u016D\x07\x04\x02\x02\u016D\u016E" + - "\x05$\x13\x02\u016E\u016F\x07\x05\x02\x02\u016F\u0179\x03\x02\x02\x02" + - "\u0170\u0179\x07\x1E\x02\x02\u0171\u0179\x07\x1F\x02\x02\u0172\u0179\x07" + - " \x02\x02\u0173\u0179\x05J&\x02\u0174\u0175\x07A\x02\x02\u0175\u0176\x05" + - "\"\x12\x02\u0176\u0177\x07B\x02\x02\u0177\u0179\x03\x02\x02\x02\u0178" + - "\u0140\x03\x02\x02\x02\u0178\u0152\x03\x02\x02\x02\u0178\u0157\x03\x02" + - "\x02\x02\u0178\u015C\x03\x02\x02\x02\u0178\u016C\x03\x02\x02\x02\u0178" + - "\u0170\x03\x02\x02\x02\u0178\u0171\x03\x02\x02\x02\u0178\u0172\x03\x02" + - "\x02\x02\u0178\u0173\x03\x02\x02\x02\u0178\u0174\x03\x02\x02\x02\u0179" + - "\u0182\x03\x02\x02\x02\u017A\u017B\f\x0E\x02\x02\u017B\u017C\x07\x1A\x02" + - "\x02\u017C\u0181\x05\"\x12\x0E\u017D\u017E\f\r\x02\x02\u017E\u017F\x07" + - "\x1B\x02\x02\u017F\u0181\x05\"\x12\r\u0180\u017A\x03\x02\x02\x02\u0180" + - "\u017D\x03\x02\x02\x02\u0181\u0184\x03\x02\x02\x02\u0182\u0180\x03\x02" + - "\x02\x02\u0182\u0183\x03\x02\x02\x02\u0183#\x03\x02\x02\x02\u0184\u0182" + - "\x03\x02\x02\x02\u0185\u0186\x05&\x14\x02\u0186\u0187\x07\x07\x02\x02" + - "\u0187\u0188\x05\"\x12\x02\u0188\u0189\x07\n\x02\x02\u0189\u018B\x03\x02" + - "\x02\x02\u018A\u0185\x03\x02\x02\x02\u018B\u018E\x03\x02\x02\x02\u018C" + - "\u018A\x03\x02\x02\x02\u018C\u018D\x03\x02\x02\x02\u018D\u0198\x03\x02" + - "\x02\x02\u018E\u018C\x03\x02\x02\x02\u018F\u0190\x05&\x14\x02\u0190\u0191" + - "\x07\x07\x02\x02\u0191\u0192\x05\"\x12\x02\u0192\u0196\x03\x02\x02\x02" + - "\u0193\u0197\x07\n\x02\x02\u0194\u0195\x07\r\x02\x02\u0195\u0197\x07C" + - "\x02\x02\u0196\u0193\x03\x02\x02\x02\u0196\u0194\x03\x02\x02\x02\u0196" + - "\u0197\x03\x02\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u018F\x03\x02" + - "\x02\x02\u0198\u0199\x03\x02\x02\x02\u0199\u019D\x03\x02\x02\x02\u019A" + - "\u019B\x07\r\x02\x02\u019B\u019D\x07C\x02\x02\u019C\u018C\x03\x02\x02" + - "\x02\u019C\u019A\x03\x02\x02\x02\u019D%\x03\x02\x02\x02\u019E\u019F\x05" + - "L\'\x02\u019F\'\x03\x02\x02\x02\u01A0\u01A1\b\x15\x01\x02\u01A1\u0237" + - "\x052\x1A\x02\u01A2\u01A3\x05B\"\x02\u01A3\u01A5\x07A\x02\x02\u01A4\u01A6" + - "\x05> \x02\u01A5\u01A4\x03\x02\x02\x02\u01A5\u01A6\x03\x02\x02\x02\u01A6" + - "\u01A7\x03\x02\x02\x02\u01A7\u01A8\x07B\x02\x02\u01A8\u0237\x03\x02\x02" + - "\x02\u01A9\u01AA\x076\x02\x02\u01AA\u0237\x05(\x15\x1B\u01AB\u01AC\x05" + - "J&\x02\u01AC\u01AD\x07\"\x02\x02\u01AD\u01AE\x07@\x02\x02\u01AE\u01AF" + - "\x05(\x15\x17\u01AF\u0237\x03\x02\x02\x02\u01B0\u01B1\x07-\x02\x02\u01B1" + - "\u01B2\x07\x04\x02\x02\u01B2\u01B7\x05(\x15\x02\u01B3\u01B4\x07\n\x02" + - "\x02\u01B4\u01B6\x05(\x15\x02\u01B5\u01B3\x03\x02\x02\x02\u01B6\u01B9" + - "\x03\x02\x02\x02\u01B7\u01B5\x03\x02\x02\x02\u01B7\u01B8\x03\x02\x02\x02" + - "\u01B8\u01BB\x03\x02\x02\x02\u01B9\u01B7\x03\x02\x02\x02\u01BA\u01BC\x07" + - "\n\x02\x02\u01BB\u01BA\x03\x02\x02\x02\u01BB\u01BC\x03\x02\x02\x02\u01BC" + - "\u01BD\x03\x02\x02\x02\u01BD\u01BE\x07\x05\x02\x02\u01BE\u0237\x03\x02" + - "\x02\x02\u01BF\u01C0\x07.\x02\x02\u01C0\u01C1\x07\x04\x02\x02\u01C1\u01C6" + - "\x05(\x15\x02\u01C2\u01C3\x07\n\x02\x02\u01C3\u01C5\x05(\x15\x02\u01C4" + - "\u01C2\x03\x02\x02\x02\u01C5\u01C8\x03\x02\x02\x02\u01C6\u01C4\x03\x02" + - "\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01CA\x03\x02\x02\x02\u01C8" + - "\u01C6\x03\x02\x02\x02\u01C9\u01CB\x07\n\x02\x02\u01CA\u01C9\x03\x02\x02" + - "\x02\u01CA\u01CB\x03\x02\x02\x02\u01CB\u01CC\x03\x02\x02\x02\u01CC\u01CD" + - "\x07\x05\x02\x02\u01CD\u0237\x03\x02\x02\x02\u01CE\u0237\x05*\x16\x02" + - "\u01CF\u01D0\x07#\x02\x02\u01D0\u01D1\x07\x04\x02\x02\u01D1\u01D6\x05" + - "(\x15\x02\u01D2\u01D3\x07\n\x02\x02\u01D3\u01D5\x05(\x15\x02\u01D4\u01D2" + - "\x03\x02\x02\x02\u01D5\u01D8\x03\x02\x02\x02\u01D6\u01D4\x03\x02\x02\x02" + - "\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01DA\x03\x02\x02\x02\u01D8\u01D6\x03" + - "\x02\x02\x02\u01D9\u01DB\x07\n\x02\x02\u01DA\u01D9\x03\x02\x02\x02\u01DA" + - "\u01DB\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x07\x05" + - "\x02\x02\u01DD\u0237\x03\x02\x02\x02\u01DE\u01DF\x07$\x02\x02\u01DF\u01E0" + - "\x07\x04\x02\x02\u01E0\u01E5\x05(\x15\x02\u01E1\u01E2\x07\n\x02\x02\u01E2" + - "\u01E4\x05(\x15\x02\u01E3\u01E1\x03\x02\x02\x02\u01E4\u01E7\x03\x02\x02" + - "\x02\u01E5\u01E3\x03\x02\x02\x02\u01E5\u01E6\x03\x02\x02\x02\u01E6\u01E9" + - "\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02\u01E8\u01EA\x07\n\x02\x02" + - "\u01E9\u01E8\x03\x02\x02\x02\u01E9\u01EA\x03\x02\x02\x02\u01EA\u01EB\x03" + - "\x02\x02\x02\u01EB\u01EC\x07\x05\x02\x02\u01EC\u0237\x03\x02\x02\x02\u01ED" + - "\u01F2\x05J&\x02\u01EE\u01F2\x07,\x02\x02\u01EF\u01F2\x07+\x02\x02\u01F0" + - "\u01F2\x07*\x02\x02\u01F1\u01ED\x03\x02\x02\x02\u01F1\u01EE\x03\x02\x02" + - "\x02\u01F1\u01EF\x03\x02\x02\x02\u01F1\u01F0\x03\x02\x02\x02\u01F2\u0237" + - "\x03\x02\x02\x02\u01F3\u01F4\x07A\x02\x02\u01F4\u01F5\x05(\x15\x02\u01F5" + - "\u01F6\x07\n\x02\x02\u01F6\u01FB\x05(\x15\x02\u01F7\u01F8\x07\n\x02\x02" + - "\u01F8\u01FA\x05(\x15\x02\u01F9\u01F7\x03\x02\x02\x02\u01FA\u01FD\x03" + - "\x02"; + "\x07\x03\x07\x05\x07\xCB\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07\b\xD2" + + "\n\b\f\b\x0E\b\xD5\v\b\x03\b\x05\b\xD8\n\b\x03\t\x05\t\xDB\n\t\x03\t\x03" + + "\t\x03\t\x07\t\xE0\n\t\f\t\x0E\t\xE3\v\t\x03\n\x03\n\x03\n\x03\n\x03\n" + + "\x05\n\xEA\n\n\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x03" + + "\v\x05\v\xF6\n\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\xFE\n\f\x03" + + "\f\x03\f\x03\f\x03\f\x05\f\u0104\n\f\x03\f\x03\f\x05\f\u0108\n\f\x05\f" + + "\u010A\n\f\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r" + + "\u0115\n\r\x05\r\u0117\n\r\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03" + + "\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x07\x0E\u0124\n\x0E\f\x0E" + + "\x0E\x0E\u0127\v\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u012E" + + "\n\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x07\x0E\u013B\n\x0E\f\x0E\x0E\x0E\u013E\v\x0E" + + "\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E\x05\x0E\u0145\n\x0E\x05\x0E\u0147" + + "\n\x0E\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03\x11\x03\x12\x03\x12" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0156\n\x13\f\x13\x0E" + + "\x13\u0159\v\x13\x05\x13\u015B\n\x13\x03\x13\x05\x13\u015E\n\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x07\x13\u0175\n\x13\f\x13\x0E\x13\u0178\v\x13\x03\x13" + + "\x05\x13\u017B\n\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u0181\n\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + + "\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u0192\n\x13\f" + + "\x13\x0E\x13\u0195\v\x13\x03\x13\x03\x13\x05\x13\u0199\n\x13\x03\x13\x03" + + "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x07\x13\u01A1\n\x13\f\x13\x0E\x13" + + "\u01A4\v\x13\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x15\x07\x15\u01B1\n\x15\f\x15\x0E\x15\u01B4\v" + + "\x15\x03\x15\x03\x15\x03\x15\x05\x15\u01B9\n\x15\x03\x15\x03\x15\x05\x15" + + "\u01BD\n\x15\x03\x16\x03\x16\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05" + + "\x17\u01C6\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01D6" + + "\n\x17\f\x17\x0E\x17\u01D9\v\x17\x03\x17\x05\x17\u01DC\n\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01E5\n\x17\f\x17" + + "\x0E\x17\u01E8\v\x17\x03\x17\x05\x17\u01EB\n\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u01F5\n\x17\f\x17\x0E" + + "\x17\u01F8\v\x17\x03\x17\x05\x17\u01FB\n\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x07\x17\u0204\n\x17\f\x17\x0E\x17\u0207\v" + + "\x17\x03\x17\x05\x17\u020A\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x05\x17\u0212\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x07\x17\u021A\n\x17\f\x17\x0E\x17\u021D\v\x17\x03\x17\x05\x17\u0220" + + "\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x07\x17\u022A\n\x17\f\x17\x0E\x17\u022D\v\x17\x03\x17\x05\x17\u0230\n" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17\u0238\n\x17" + + "\f\x17\x0E\x17\u023B\v\x17\x05\x17\u023D\n\x17\x03\x17\x05\x17\u0240\n" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03" + + "\x17\x03\x17\x03\x17\x05\x17\u0256\n\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17" + + "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05\x17\u027D\n\x17\x03" + + "\x17\x05\x17\u0280\n\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x07\x17" + + "\u0287\n\x17\f\x17\x0E\x17\u028A\v\x17\x03\x18\x03\x18\x03\x18\x03\x18" + + "\x05\x18\u0290\n\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0295\n\x18\f\x18" + + "\x0E\x18\u0298\v\x18\x03\x18\x03\x18\x03\x19\x03\x19\x05\x19\u029E\n\x19" + + "\x03\x19\x03\x19\x03\x19\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x05\x1A\u02A7" + + "\n\x1A\x03\x1A\x05\x1A\u02AA\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + + "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x05\x1B\u02B5\n\x1B\x03\x1C\x03\x1C" + + "\x05\x1C\u02B9\n\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x07\x1D\u02C3\n\x1D\f\x1D\x0E\x1D\u02C6\v\x1D\x03\x1D\x03" + + "\x1D\x03\x1D\x03\x1D\x05\x1D\u02CC\n\x1D\x03\x1E\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x06\x1E\u02D3\n\x1E\r\x1E\x0E\x1E\u02D4\x03\x1E\x03\x1E\x03\x1E" + + "\x03\x1E\x03\x1E\x03\x1F\x03\x1F\x05\x1F\u02DE\n\x1F\x03 \x03 \x03!\x03" + + "!\x03!\x03!\x03\"\x03\"\x05\"\u02E8\n\"\x03#\x03#\x03#\x07#\u02ED\n#\f" + + "#\x0E#\u02F0\v#\x03$\x03$\x03$\x03$\x03$\x03$\x05$\u02F8\n$\x03%\x03%" + + "\x05%\u02FC\n%\x03&\x03&\x05&\u0300\n&\x03\'\x03\'\x03(\x03(\x03)\x03" + + ")\x03)\x07)\u0309\n)\f)\x0E)\u030C\v)\x03*\x03*\x03*\x03*\x05*\u0312\n" + + "*\x03+\x03+\x03+\x02\x02\x04$,,\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f" + + "\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E" + + "\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02" + + ":\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02L\x02N\x02P\x02R\x02T\x02" + + "\x02\n\x03\x0257\x03\x0234\x03\x028=\x04\x02-1AB\x03\x02-0\x05\x02!!-" + + "03=\x03\x02*,\x03\x02CD\x02\u0378\x02W\x03\x02\x02\x02\x04`\x03\x02\x02" + + "\x02\x06q\x03\x02\x02\x02\b\x8A\x03\x02\x02\x02\n\xBC\x03\x02\x02\x02" + + "\f\xCA\x03\x02\x02\x02\x0E\xCC\x03\x02\x02\x02\x10\xDA\x03\x02\x02\x02" + + "\x12\xE4\x03\x02\x02\x02\x14\xF5\x03\x02\x02\x02\x16\u0109\x03\x02\x02" + + "\x02\x18\u0116\x03\x02\x02\x02\x1A\u0146\x03\x02\x02\x02\x1C\u0148\x03" + + "\x02\x02\x02\x1E\u014A\x03\x02\x02\x02 \u014C\x03\x02\x02\x02\"\u014E" + + "\x03\x02\x02\x02$\u0198\x03\x02\x02\x02&\u01A5\x03\x02\x02\x02(\u01BC" + + "\x03\x02\x02\x02*\u01BE\x03\x02\x02\x02,\u0255\x03\x02\x02\x02.\u028B" + + "\x03\x02\x02\x020\u029D\x03\x02\x02\x022\u02A2\x03\x02\x02\x024\u02B4" + + "\x03\x02\x02\x026\u02B8\x03\x02\x02\x028\u02CB\x03\x02\x02\x02:\u02CD" + + "\x03\x02\x02\x02<\u02DD\x03\x02\x02\x02>\u02DF\x03\x02\x02\x02@\u02E1" + + "\x03\x02\x02\x02B\u02E7\x03\x02\x02\x02D\u02E9\x03\x02\x02\x02F\u02F7" + + "\x03\x02\x02\x02H\u02FB\x03\x02\x02\x02J\u02FF\x03\x02\x02\x02L\u0301" + + "\x03\x02\x02\x02N\u0303\x03\x02\x02\x02P\u0305\x03\x02\x02\x02R\u0311" + + "\x03\x02\x02\x02T\u0313\x03\x02\x02\x02VX\x05\x04\x03\x02WV\x03\x02\x02" + + "\x02XY\x03\x02\x02\x02YW\x03\x02\x02\x02YZ\x03\x02\x02\x02Z[\x03\x02\x02" + + "\x02[\\\x07\x02\x02\x03\\\x03\x03\x02\x02\x02]_\x07E\x02\x02^]\x03\x02" + + "\x02\x02_b\x03\x02\x02\x02`^\x03\x02\x02\x02`a\x03\x02\x02\x02ac\x03\x02" + + "\x02\x02b`\x03\x02\x02\x02cd\x07\x03\x02\x02de\x05P)\x02ei\x07\x04\x02" + + "\x02fh\x05\x06\x04\x02gf\x03\x02\x02\x02hk\x03\x02\x02\x02ig\x03\x02\x02" + + "\x02ij\x03\x02\x02\x02jl\x03\x02\x02\x02ki\x03\x02\x02\x02lm\x07\x05\x02" + + "\x02m\x05\x03\x02\x02\x02np\x07E\x02\x02on\x03\x02\x02\x02ps\x03\x02\x02" + + "\x02qo\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02sq\x03\x02\x02" + + "\x02tu\x05\b\x05\x02u\x07\x03\x02\x02\x02vw\x07\x06\x02\x02wx\x05P)\x02" + + "xy\x07\x07\x02\x02yz\x05$\x13\x02z\x8B\x03\x02\x02\x02{|\x07\b\x02\x02" + + "|}\x05P)\x02}~\x07\x07\x02\x02~\x7F\x05$\x13\x02\x7F\x8B\x03\x02\x02\x02" + + "\x80\x81\x07\t\x02\x02\x81\x82\x05<\x1F\x02\x82\x83\x07>\x02\x02\x83\x84" + + "\x05,\x17\x02\x84\x8B\x03\x02\x02\x02\x85\x8B\x05\x1A\x0E\x02\x86\x8B" + + "\x05\n\x06\x02\x87\x8B\x05\f\x07\x02\x88\x8B\x05\x16\f\x02\x89\x8B\x05" + + "\x18\r\x02\x8Av\x03\x02\x02\x02\x8A{\x03\x02\x02\x02\x8A\x80\x03\x02\x02" + + "\x02\x8A\x85\x03\x02\x02\x02\x8A\x86\x03\x02\x02\x02\x8A\x87\x03\x02\x02" + + "\x02\x8A\x88\x03\x02\x02\x02\x8A\x89\x03\x02\x02\x02\x8B\t\x03\x02\x02" + + "\x02\x8C\x8D\x05\x14\v\x02\x8D\x8E\x05H%\x02\x8E\x8F\x07?\x02\x02\x8F" + + "\x94\x05@!\x02\x90\x91\x07\n\x02\x02\x91\x93\x05@!\x02\x92\x90\x03\x02" + + "\x02\x02\x93\x96\x03\x02\x02\x02\x94\x92\x03\x02\x02\x02\x94\x95\x03\x02" + + "\x02\x02\x95\x97\x03\x02\x02\x02\x96\x94\x03\x02\x02\x02\x97\x98\x07@" + + "\x02\x02\x98\x99\x07\x07\x02\x02\x99\x9C\x05$\x13\x02\x9A\x9B\x07>\x02" + + "\x02\x9B\x9D\x05,\x17\x02\x9C\x9A\x03\x02\x02\x02\x9C\x9D\x03\x02\x02" + + "\x02\x9D\x9F\x03\x02\x02\x02\x9E\xA0\x07\v\x02\x02\x9F\x9E\x03\x02\x02" + + "\x02\x9F\xA0\x03\x02\x02\x02\xA0\xBD\x03\x02\x02\x02\xA1\xA2\x05\x14\v" + + "\x02\xA2\xAF\x05H%\x02\xA3\xAC\x07?\x02\x02\xA4\xA9\x05> \x02\xA5\xA6" + + "\x07\n\x02\x02\xA6\xA8\x05> \x02\xA7\xA5\x03\x02\x02\x02\xA8\xAB\x03\x02" + + "\x02\x02\xA9\xA7\x03\x02\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA\xAD\x03\x02" + + "\x02\x02\xAB\xA9\x03\x02\x02\x02\xAC\xA4\x03\x02\x02\x02\xAC\xAD\x03\x02" + + "\x02\x02\xAD\xAE\x03\x02\x02\x02\xAE\xB0\x07@\x02\x02\xAF\xA3\x03\x02" + + "\x02\x02\xAF\xB0\x03\x02\x02\x02\xB0\xB3\x03\x02\x02\x02\xB1\xB2\x07\x07" + + "\x02\x02\xB2\xB4\x05$\x13\x02\xB3\xB1\x03\x02\x02\x02\xB3\xB4\x03\x02" + + "\x02\x02\xB4\xB7\x03\x02\x02\x02\xB5\xB6\x07>\x02\x02\xB6\xB8\x05,\x17" + + "\x02\xB7\xB5\x03\x02\x02\x02\xB7\xB8\x03\x02\x02\x02\xB8\xBA\x03\x02\x02" + + "\x02\xB9\xBB\x07\v\x02\x02\xBA\xB9\x03\x02\x02\x02\xBA\xBB\x03\x02\x02" + + "\x02\xBB\xBD\x03\x02\x02\x02\xBC\x8C\x03\x02\x02\x02\xBC\xA1\x03\x02\x02" + + "\x02\xBD\v\x03\x02\x02\x02\xBE\xBF\x07\f\x02\x02\xBF\xCB\x05P)\x02\xC0" + + "\xC1\x07\f\x02\x02\xC1\xC2\x05\x0E\b\x02\xC2\xC3\x07>\x02\x02\xC3\xC4" + + "\x05$\x13\x02\xC4\xCB\x03\x02\x02\x02\xC5\xC6\x07\f\x02\x02\xC6\xC7\x05" + + "\x0E\b\x02\xC7\xC8\x07>\x02\x02\xC8\xC9\x05\x10\t\x02\xC9\xCB\x03\x02" + + "\x02\x02\xCA\xBE\x03\x02\x02\x02\xCA\xC0\x03\x02\x02\x02\xCA\xC5\x03\x02" + + "\x02\x02\xCB\r\x03\x02\x02\x02\xCC\xD7\x05P)\x02\xCD\xCE\x07\r\x02\x02" + + "\xCE\xD3\x07C\x02\x02\xCF\xD0\x07\n\x02\x02\xD0\xD2\x07C\x02\x02\xD1\xCF" + + "\x03\x02\x02\x02\xD2\xD5\x03\x02\x02\x02\xD3\xD1\x03\x02\x02\x02\xD3\xD4" + + "\x03\x02\x02\x02\xD4\xD6\x03\x02\x02\x02\xD5\xD3\x03\x02\x02\x02\xD6\xD8" + + "\x07\x0E\x02\x02\xD7\xCD\x03\x02\x02\x02\xD7\xD8\x03\x02\x02\x02\xD8\x0F" + + "\x03\x02\x02\x02\xD9\xDB\x07\x0F\x02\x02\xDA\xD9\x03\x02\x02\x02\xDA\xDB" + + "\x03\x02\x02\x02\xDB\xDC\x03\x02\x02\x02\xDC\xE1\x05\x12\n\x02\xDD\xDE" + + "\x07\x0F\x02\x02\xDE\xE0\x05\x12\n\x02\xDF\xDD\x03\x02\x02\x02\xE0\xE3" + + "\x03\x02\x02\x02\xE1\xDF\x03\x02\x02\x02\xE1\xE2\x03\x02\x02\x02\xE2\x11" + + "\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE4\xE9\x05R*\x02\xE5\xE6\x07" + + "?\x02\x02\xE6\xE7\x05$\x13\x02\xE7\xE8\x07@\x02\x02\xE8\xEA\x03\x02\x02" + + "\x02\xE9\xE5\x03\x02\x02\x02\xE9\xEA\x03\x02\x02\x02\xEA\x13\x03\x02\x02" + + "\x02\xEB\xF6\x07\x10\x02\x02\xEC\xF6\x07\x11\x02\x02\xED\xEE\x07\x12\x02" + + "\x02\xEE\xF6\x07\x10\x02\x02\xEF\xF0\x07\x12\x02\x02\xF0\xF6\x07\x11\x02" + + "\x02\xF1\xF6\x07\x13\x02\x02\xF2\xF6\x07\x14\x02\x02\xF3\xF6\x07\x15\x02" + + "\x02\xF4\xF6\x07\x16\x02\x02\xF5\xEB\x03\x02\x02\x02\xF5\xEC\x03\x02\x02" + + "\x02\xF5\xED\x03\x02\x02\x02\xF5\xEF\x03\x02\x02\x02\xF5\xF1\x03\x02\x02" + + "\x02\xF5\xF2\x03\x02\x02\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF4\x03\x02\x02" + + "\x02\xF6\x15\x03\x02\x02\x02\xF7\xF8\x07\x17\x02\x02\xF8\xF9\x05\x1E\x10" + + "\x02\xF9\xFA\x07\x18\x02\x02\xFA\xFD\x05B\"\x02\xFB\xFC\x07\x19\x02\x02" + + "\xFC\xFE\x05\"\x12\x02\xFD\xFB\x03\x02\x02\x02\xFD\xFE\x03\x02\x02\x02" + + "\xFE\u010A\x03\x02\x02\x02\xFF\u0100\x07\x17\x02\x02\u0100\u0103\x05\x1E" + + "\x10\x02\u0101\u0102\x07\x1A\x02\x02\u0102\u0104\x05\x1E\x10\x02\u0103" + + "\u0101\x03\x02\x02\x02\u0103\u0104\x03\x02\x02\x02\u0104\u0107\x03\x02" + + "\x02\x02\u0105\u0106\x07\x19\x02\x02\u0106\u0108\x05\"\x12\x02\u0107\u0105" + + "\x03\x02\x02\x02\u0107\u0108\x03\x02\x02\x02\u0108\u010A\x03\x02\x02\x02" + + "\u0109\xF7\x03\x02\x02\x02\u0109\xFF\x03\x02\x02\x02\u010A\x17\x03\x02" + + "\x02\x02\u010B\u010C\x07\x1B\x02\x02\u010C\u010D\x05\x1E\x10\x02\u010D" + + "\u010E\x07\x18\x02\x02\u010E\u010F\x05B\"\x02\u010F\u0117\x03\x02\x02" + + "\x02\u0110\u0111\x07\x1B\x02\x02\u0111\u0114\x05\x1E\x10\x02\u0112\u0113" + + "\x07\x1A\x02\x02\u0113\u0115\x05\x1E\x10\x02\u0114\u0112\x03\x02\x02\x02" + + "\u0114\u0115\x03\x02\x02\x02\u0115\u0117\x03\x02\x02\x02\u0116\u010B\x03" + + "\x02\x02\x02\u0116\u0110\x03\x02\x02\x02\u0117\x19\x03\x02\x02\x02\u0118" + + "\u0119\x07\x17\x02\x02\u0119\u011A\x05\x1C\x0F\x02\u011A\u011B\x07?\x02" + + "\x02\u011B\u011C\x05\x1E\x10\x02\u011C\u011D\x07>\x02\x02\u011D\u0125" + + "\x05,\x17\x02\u011E\u011F\x07\n\x02\x02\u011F\u0120\x05\x1E\x10\x02\u0120" + + "\u0121\x07>\x02\x02\u0121\u0122\x05,\x17\x02\u0122\u0124\x03\x02\x02\x02" + + "\u0123\u011E\x03\x02\x02\x02\u0124\u0127\x03\x02\x02\x02\u0125\u0123\x03" + + "\x02\x02\x02\u0125\u0126\x03\x02\x02\x02\u0126\u0128\x03\x02\x02\x02\u0127" + + "\u0125\x03\x02\x02\x02\u0128\u0129\x07@\x02\x02\u0129\u012A\x07\x18\x02" + + "\x02\u012A\u012D\x075\x02\x02\u012B\u012C\x07\x19\x02\x02\u012C\u012E" + + "\x05\"\x12\x02\u012D\u012B\x03\x02\x02\x02\u012D\u012E\x03\x02\x02\x02" + + "\u012E\u0147\x03\x02\x02\x02\u012F\u0130\x07\x17\x02\x02\u0130\u0131\x05" + + "\x1C\x0F\x02\u0131\u0132\x07?\x02\x02\u0132\u0133\x05\x1E\x10\x02\u0133" + + "\u0134\x07>\x02\x02\u0134\u013C\x05,\x17\x02\u0135\u0136\x07\n\x02\x02" + + "\u0136\u0137\x05\x1E\x10\x02\u0137\u0138\x07>\x02\x02\u0138\u0139\x05" + + ",\x17\x02\u0139\u013B\x03\x02\x02\x02\u013A\u0135\x03\x02\x02\x02\u013B" + + "\u013E\x03\x02\x02\x02\u013C\u013A\x03\x02\x02\x02\u013C\u013D\x03\x02" + + "\x02\x02\u013D\u013F\x03\x02\x02\x02\u013E\u013C\x03\x02\x02\x02\u013F" + + "\u0140\x07@\x02\x02\u0140\u0141\x07\x1A\x02\x02\u0141\u0144\x05 \x11\x02" + + "\u0142\u0143\x07\x19\x02\x02\u0143\u0145\x05\"\x12\x02\u0144\u0142\x03" + + "\x02\x02\x02\u0144\u0145\x03\x02\x02\x02\u0145\u0147\x03\x02\x02\x02\u0146" + + "\u0118\x03\x02\x02\x02\u0146\u012F\x03\x02\x02\x02\u0147\x1B\x03\x02\x02" + + "\x02\u0148\u0149\x05P)\x02\u0149\x1D\x03\x02\x02\x02\u014A\u014B\x05P" + + ")\x02\u014B\x1F\x03\x02\x02\x02\u014C\u014D\x05P)\x02\u014D!\x03\x02\x02" + + "\x02\u014E\u014F\x07*\x02\x02\u014F#\x03\x02\x02\x02\u0150\u0151\b\x13" + + "\x01\x02\u0151\u015A\x07?\x02\x02\u0152\u0157\x05$\x13\x02\u0153\u0154" + + "\x07\n\x02\x02\u0154\u0156\x05$\x13\x02\u0155\u0153\x03\x02\x02\x02\u0156" + + "\u0159\x03\x02\x02\x02\u0157\u0155\x03\x02\x02\x02\u0157\u0158\x03\x02" + + "\x02\x02\u0158\u015B\x03\x02\x02\x02\u0159\u0157\x03\x02\x02\x02\u015A" + + "\u0152\x03\x02\x02\x02\u015A\u015B\x03\x02\x02\x02\u015B\u015D\x03\x02" + + "\x02\x02\u015C\u015E\x07\n\x02\x02\u015D\u015C\x03\x02\x02\x02\u015D\u015E" + + "\x03\x02\x02\x02\u015E\u015F\x03\x02\x02\x02\u015F\u0160\x07@\x02\x02" + + "\u0160\u0161\x07\x1D\x02\x02\u0161\u0199\x05$\x13\x0F\u0162\u0163\x07" + + "A\x02\x02\u0163\u0164\x07\r\x02\x02\u0164\u0165\x05$\x13\x02\u0165\u0166" + + "\x07\x0E\x02\x02\u0166\u0199\x03\x02\x02\x02\u0167\u0168\x07B\x02\x02" + + "\u0168\u0169\x07\r\x02\x02\u0169\u016A\x05$\x13\x02\u016A\u016B\x07\x0E" + + "\x02\x02\u016B\u0199\x03\x02\x02\x02\u016C\u016D\x07?\x02\x02\u016D\u0199" + + "\x07@\x02\x02\u016E\u016F\x07?\x02\x02\u016F\u0170\x05$\x13\x02\u0170" + + "\u0171\x07\n\x02\x02\u0171\u0176\x05$\x13\x02\u0172\u0173\x07\n\x02\x02" + + "\u0173\u0175\x05$\x13\x02\u0174\u0172\x03\x02\x02\x02\u0175\u0178\x03" + + "\x02\x02\x02\u0176\u0174\x03\x02\x02\x02\u0176\u0177\x03\x02\x02\x02\u0177" + + "\u017A\x03\x02\x02\x02\u0178\u0176\x03\x02\x02\x02\u0179\u017B\x07\n\x02" + + "\x02\u017A\u0179\x03\x02\x02\x02\u017A\u017B\x03\x02\x02\x02\u017B\u017C" + + "\x03\x02\x02\x02\u017C\u017D\x07@\x02\x02\u017D\u0199\x03\x02\x02\x02" + + "\u017E\u0180\x07\x04\x02\x02\u017F\u0181\x05(\x15\x02\u0180\u017F\x03" + + "\x02\x02\x02\u0180\u0181\x03\x02\x02\x02\u0181\u0182\x03\x02\x02\x02\u0182" + + "\u0199\x07\x05\x02\x02\u0183\u0199\x07\x1E\x02\x02\u0184\u0199\x07\x1F" + + "\x02\x02\u0185\u0199\x07 \x02\x02\u0186\u0199\x05&\x14\x02\u0187\u0199" + + "\x05P)\x02\u0188\u0189\x07?\x02\x02\u0189\u018A\x05$\x13\x02\u018A\u018B" + + "\x07@\x02\x02\u018B\u0199\x03\x02\x02\x02\u018C\u018D\x05P)\x02\u018D" + + "\u018E\x07\r\x02\x02\u018E\u0193\x05$\x13\x02\u018F\u0190\x07\n\x02\x02" + + "\u0190\u0192\x05$\x13\x02\u0191\u018F\x03\x02\x02\x02\u0192\u0195\x03" + + "\x02\x02\x02\u0193\u0191\x03\x02\x02\x02\u0193\u0194\x03\x02\x02\x02\u0194" + + "\u0196\x03\x02\x02\x02\u0195\u0193\x03\x02\x02\x02\u0196\u0197\x07\x0E" + + "\x02\x02\u0197\u0199\x03\x02\x02\x02\u0198\u0150\x03\x02\x02\x02\u0198" + + "\u0162\x03\x02\x02\x02\u0198\u0167\x03\x02\x02\x02\u0198\u016C\x03\x02" + + "\x02\x02\u0198\u016E\x03\x02\x02\x02\u0198\u017E\x03\x02\x02\x02\u0198" + + "\u0183\x03\x02\x02\x02\u0198\u0184\x03\x02\x02\x02\u0198\u0185\x03\x02" + + "\x02\x02\u0198\u0186\x03\x02\x02\x02\u0198\u0187\x03\x02\x02\x02\u0198" + + "\u0188\x03\x02\x02\x02\u0198\u018C\x03\x02\x02\x02\u0199\u01A2\x03\x02" + + "\x02\x02\u019A\u019B\f\x11\x02\x02\u019B\u019C\x07\x1C\x02\x02\u019C\u01A1" + + "\x05$\x13\x11\u019D\u019E\f\x10\x02\x02\u019E\u019F\x07\x1D\x02\x02\u019F" + + "\u01A1\x05$\x13\x10\u01A0\u019A\x03\x02\x02\x02\u01A0\u019D\x03\x02\x02" + + "\x02\u01A1\u01A4\x03\x02\x02\x02\u01A2\u01A0\x03\x02\x02\x02\u01A2\u01A3" + + "\x03\x02\x02\x02\u01A3%\x03\x02\x02\x02\u01A4\u01A2\x03\x02\x02\x02\u01A5" + + "\u01A6\x07C\x02\x02\u01A6\'\x03\x02\x02\x02\u01A7\u01A8\x05*\x16\x02\u01A8" + + "\u01A9\x07\x07\x02\x02\u01A9\u01AA\x05$\x13\x02\u01AA\u01B2\x03\x02\x02" + + "\x02\u01AB\u01AC\x07\n\x02\x02\u01AC\u01AD\x05*\x16\x02\u01AD\u01AE\x07" + + "\x07\x02\x02\u01AE\u01AF\x05$\x13\x02\u01AF\u01B1\x03\x02\x02\x02\u01B0" + + "\u01AB\x03\x02\x02\x02\u01B1\u01B4\x03\x02\x02\x02\u01B2\u01B0\x03\x02" + + "\x02\x02\u01B2\u01B3\x03\x02\x02\x02\u01B3\u01B8\x03\x02\x02\x02\u01B4" + + "\u01B2\x03\x02\x02\x02\u01B5\u01B9\x07\n\x02\x02\u01B6\u01B7\x07\x0F\x02" + + "\x02\u01B7\u01B9\x05T+\x02\u01B8\u01B5\x03\x02\x02\x02\u01B8\u01B6\x03" + + "\x02\x02\x02\u01B8\u01B9\x03\x02\x02\x02\u01B9\u01BD\x03\x02\x02\x02\u01BA" + + "\u01BB\x07\x0F\x02\x02\u01BB\u01BD\x05T+\x02\u01BC\u01A7\x03\x02\x02\x02" + + "\u01BC\u01BA\x03\x02\x02\x02\u01BD)\x03\x02\x02\x02\u01BE\u01BF\x05R*" + + "\x02\u01BF+\x03\x02\x02\x02\u01C0\u01C1\b\x17\x01\x02\u01C1\u0256\x05" + + "6\x1C\x02\u01C2\u01C3\x05H%\x02\u01C3\u01C5\x07?\x02\x02\u01C4\u01C6\x05" + + "D#\x02\u01C5\u01C4\x03\x02\x02\x02\u01C5\u01C6\x03\x02\x02\x02\u01C6\u01C7" + + "\x03\x02\x02\x02\u01C7\u01C8\x07@\x02\x02\u01C8\u0256\x03\x02\x02\x02" + + "\u01C9\u01CA\x074\x02\x02\u01CA\u0256\x05,\x17\x1B\u01CB\u01CC\x05P)\x02" + + "\u01CC\u01CD\x07\"\x02\x02\u01CD\u01CE\x07>\x02\x02\u01CE\u01CF\x05,\x17" + + "\x17\u01CF\u0256\x03\x02\x02\x02\u01D0\u01D1\x07-\x02\x02\u01D1\u01D2" + + "\x07\x04\x02\x02\u01D2\u01D7\x05,\x17\x02\u01D3\u01D4\x07\n\x02\x02\u01D4" + + "\u01D6\x05,\x17\x02\u01D5\u01D3\x03\x02\x02\x02\u01D6\u01D9\x03\x02\x02" + + "\x02\u01D7\u01D5\x03\x02\x02\x02\u01D7\u01D8\x03\x02\x02\x02\u01D8\u01DB" + + "\x03\x02\x02\x02\u01D9\u01D7\x03\x02\x02\x02\u01DA\u01DC\x07\n\x02\x02" + + "\u01DB\u01DA\x03\x02\x02\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x03" + + "\x02\x02\x02\u01DD\u01DE\x07\x05\x02\x02\u01DE\u0256\x03\x02\x02\x02\u01DF" + + "\u01E0\x07.\x02\x02\u01E0\u01E1\x07\x04\x02\x02\u01E1\u01E6\x05,\x17\x02" + + "\u01E2\u01E3\x07\n\x02\x02\u01E3\u01E5\x05,\x17\x02\u01E4\u01E2\x03\x02" + + "\x02\x02\u01E5\u01E8\x03\x02\x02\x02\u01E6\u01E4\x03\x02\x02\x02\u01E6" + + "\u01E7\x03\x02\x02\x02\u01E7\u01EA\x03\x02\x02\x02\u01E8\u01E6\x03\x02" + + "\x02\x02\u01E9\u01EB\x07\n\x02\x02\u01EA\u01E9\x03\x02\x02\x02\u01EA\u01EB" + + "\x03\x02\x02\x02\u01EB\u01EC\x03\x02\x02\x02\u01EC\u01ED\x07\x05\x02\x02" + + "\u01ED\u0256\x03\x02\x02\x02\u01EE\u0256\x05.\x18\x02\u01EF\u01F0\x07" + + "#\x02\x02"; private static readonly _serializedATNSegment1: string = - "\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC" + - "\u01FF\x03\x02\x02\x02\u01FD\u01FB\x03\x02\x02\x02\u01FE\u0200\x07\n\x02" + - "\x02\u01FF\u01FE\x03\x02\x02\x02\u01FF\u0200\x03\x02\x02\x02\u0200\u0201" + - "\x03\x02\x02\x02\u0201\u0202\x07B\x02\x02\u0202\u0237\x03\x02\x02\x02" + - "\u0203\u0204\x07\x04\x02\x02\u0204\u0209\x05@!\x02\u0205\u0206\x07\n\x02" + - "\x02\u0206\u0208\x05@!\x02\u0207\u0205\x03\x02\x02\x02\u0208\u020B\x03" + - "\x02\x02\x02\u0209\u0207\x03\x02\x02\x02\u0209\u020A\x03\x02\x02\x02\u020A" + - "\u020D\x03\x02\x02\x02\u020B\u0209\x03\x02\x02\x02\u020C\u020E\x07\n\x02" + - "\x02\u020D\u020C\x03\x02\x02\x02\u020D\u020E\x03\x02\x02\x02\u020E\u020F" + - "\x03\x02\x02\x02\u020F\u0210\x07\x05\x02\x02\u0210\u0237\x03\x02\x02\x02" + - "\u0211\u021A\x07\x1C\x02\x02\u0212\u0217\x05(\x15\x02\u0213\u0214\x07" + - "\n\x02\x02\u0214\u0216\x05(\x15\x02\u0215\u0213\x03\x02\x02\x02\u0216" + - "\u0219\x03\x02\x02\x02\u0217\u0215\x03\x02\x02\x02\u0217\u0218\x03\x02" + - "\x02\x02\u0218\u021B\x03\x02\x02\x02\u0219\u0217\x03\x02\x02\x02\u021A" + - "\u0212\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021D\x03\x02" + - "\x02\x02\u021C\u021E\x07\n\x02\x02\u021D\u021C\x03\x02\x02\x02\u021D\u021E" + - "\x03\x02\x02\x02\u021E\u021F\x03\x02\x02\x02\u021F\u0237\x07\x1D\x02\x02" + - "\u0220\u0221\x07%\x02\x02\u0221\u0222\x07A\x02\x02\u0222\u0223\x05(\x15" + - "\x02\u0223\u0224\x07B\x02\x02\u0224\u0225\x05(\x15\x02\u0225\u0226\x07" + - "&\x02\x02\u0226\u0227\x05(\x15\x07\u0227\u0237\x03\x02\x02\x02\u0228\u0229" + - "\x05\n\x06\x02\u0229\u022A\x05(\x15\x06\u022A\u0237\x03\x02\x02\x02\u022B" + - "\u022C\x05\x10\t\x02\u022C\u022D\x05(\x15\x05\u022D\u0237\x03\x02\x02" + - "\x02\u022E\u022F\x07A\x02\x02\u022F\u0230\x05(\x15\x02\u0230\u0231\x07" + - "B\x02\x02\u0231\u0237\x03\x02\x02\x02\u0232\u0233\x07\x04\x02\x02\u0233" + - "\u0234\x05(\x15\x02\u0234\u0235\x07\x05\x02\x02\u0235\u0237\x03\x02\x02" + - "\x02\u0236\u01A0\x03\x02\x02\x02\u0236\u01A2\x03\x02\x02\x02\u0236\u01A9" + - "\x03\x02\x02\x02\u0236\u01AB\x03\x02\x02\x02\u0236\u01B0\x03\x02\x02\x02" + - "\u0236\u01BF\x03\x02\x02\x02\u0236\u01CE\x03\x02\x02\x02\u0236\u01CF\x03" + - "\x02\x02\x02\u0236\u01DE\x03\x02\x02\x02\u0236\u01F1\x03\x02\x02\x02\u0236" + - "\u01F3\x03\x02\x02\x02\u0236\u0203\x03\x02\x02\x02\u0236\u0211\x03\x02" + - "\x02\x02\u0236\u0220\x03\x02\x02\x02\u0236\u0228\x03\x02\x02\x02\u0236" + - "\u022B\x03\x02\x02\x02\u0236\u022E\x03\x02\x02\x02\u0236\u0232\x03\x02" + - "\x02\x02\u0237\u0269\x03\x02\x02\x02\u0238\u0239\f\x1C\x02\x02\u0239\u023A" + - "\x07!\x02\x02\u023A\u0268\x05(\x15\x1C\u023B\u023C\f\x1A\x02\x02\u023C" + - "\u023D\t\x02\x02\x02\u023D\u0268\x05(\x15\x1B\u023E\u023F\f\x19\x02\x02" + - "\u023F\u0240\t\x03\x02\x02\u0240\u0268\x05(\x15\x1A\u0241\u0242\f\x18" + - "\x02\x02\u0242\u0243\t\x04\x02\x02\u0243\u0268\x05(\x15\x19\u0244\u0245" + - "\f\x16\x02\x02\u0245\u0246\x07@\x02\x02\u0246\u0247\x05(\x15\x17\u0247" + - "\u0248\b\x15\x01\x02\u0248\u0268\x03\x02\x02\x02\u0249\u024A\f\x14\x02" + - "\x02\u024A\u024B\x07-\x02\x02\u024B\u0268\x05(\x15\x15\u024C\u024D\f\x12" + - "\x02\x02\u024D\u024E\x07.\x02\x02\u024E\u0268\x05(\x15\x13\u024F\u0250" + - "\f\x11\x02\x02\u0250\u0251\x07/\x02\x02\u0251\u0268\x05(\x15\x12\u0252" + - "\u0253\f\x10\x02\x02\u0253\u0254\x070\x02\x02\u0254\u0268\x05(\x15\x11" + - "\u0255\u0256\f\n\x02\x02\u0256\u0257\x07\x1A\x02\x02\u0257\u0268\x05(" + - "\x15\v\u0258\u0259\f \x02\x02\u0259\u025A\x07\x16\x02\x02\u025A\u0260" + - "\x05D#\x02\u025B\u025D\x07A\x02\x02\u025C\u025E\x05> \x02\u025D\u025C" + - "\x03\x02\x02\x02\u025D\u025E\x03\x02\x02\x02\u025E\u025F\x03\x02\x02\x02" + - "\u025F\u0261\x07B\x02\x02\u0260\u025B\x03\x02\x02\x02\u0260\u0261\x03" + - "\x02\x02\x02\u0261\u0268\x03\x02\x02\x02\u0262\u0263\f\x1D\x02\x02\u0263" + - "\u0264\x07\x1C\x02\x02\u0264\u0265\x05(\x15\x02\u0265\u0266\x07\x1D\x02" + - "\x02\u0266\u0268\x03\x02\x02\x02\u0267\u0238\x03\x02\x02\x02\u0267\u023B" + - "\x03\x02\x02\x02\u0267\u023E\x03\x02\x02\x02\u0267\u0241\x03\x02\x02\x02" + - "\u0267\u0244\x03\x02\x02\x02\u0267\u0249\x03\x02\x02\x02\u0267\u024C\x03" + - "\x02\x02\x02\u0267\u024F\x03\x02\x02\x02\u0267\u0252\x03\x02\x02\x02\u0267" + - "\u0255\x03\x02\x02\x02\u0267\u0258\x03\x02\x02\x02\u0267\u0262\x03\x02" + - "\x02\x02\u0268\u026B\x03\x02\x02\x02\u0269\u0267\x03\x02\x02\x02\u0269" + - "\u026A\x03\x02\x02\x02\u026A)\x03\x02\x02\x02\u026B\u0269\x03\x02\x02" + - "\x02\u026C\u026D\x074\x02\x02\u026D\u026E\x05(\x15\x02\u026E\u0270\x07" + - "\x04\x02\x02\u026F\u0271\x07\r\x02\x02\u0270\u026F\x03\x02\x02\x02\u0270" + - "\u0271\x03\x02\x02\x02\u0271\u0272\x03\x02\x02\x02\u0272\u0277\x05,\x17" + - "\x02\u0273\u0274\x07\r\x02\x02\u0274\u0276\x05,\x17\x02\u0275\u0273\x03" + - "\x02\x02\x02\u0276\u0279\x03\x02\x02\x02\u0277\u0275\x03\x02\x02\x02\u0277" + - "\u0278\x03\x02\x02\x02\u0278\u027A\x03\x02\x02\x02\u0279\u0277\x03\x02" + - "\x02\x02\u027A\u027B\x07\x05\x02\x02\u027B+\x03\x02\x02\x02\u027C\u027F" + - "\x05.\x18\x02\u027D\u027F\x07\'\x02\x02\u027E\u027C\x03\x02\x02\x02\u027E" + - "\u027D\x03\x02\x02\x02\u027F\u0280\x03\x02\x02\x02\u0280\u0281\x07\x1B" + - "\x02\x02\u0281\u0282\x05(\x15\x02\u0282-\x03\x02\x02\x02\u0283\u028A\x05" + - "L\'\x02\u0284\u0287\x07A\x02\x02\u0285\u0288\x05L\'\x02\u0286\u0288\x07" + - "\'\x02\x02\u0287\u0285\x03\x02\x02\x02\u0287\u0286\x03\x02\x02\x02\u0288" + - "\u0289\x03\x02\x02\x02\u0289\u028B\x07B\x02\x02\u028A\u0284\x03\x02\x02" + - "\x02\u028A\u028B\x03\x02\x02\x02\u028B/\x03\x02\x02\x02\u028C\u028D\x05" + - "\b\x05\x02\u028D\u028E\x07\x02\x02\x03\u028E\u0296\x03\x02\x02\x02\u028F" + - "\u0290\x05(\x15\x02\u0290\u0291\x07\x02\x02\x03\u0291\u0296\x03\x02\x02" + - "\x02\u0292\u0293\x07D\x02\x02\u0293\u0296\x07\x02\x02\x03\u0294\u0296" + - "\x07\x02\x02\x03\u0295\u028C\x03\x02\x02\x02\u0295\u028F\x03\x02\x02\x02" + - "\u0295\u0292\x03\x02\x02\x02\u0295\u0294\x03\x02\x02\x02\u02961\x03\x02" + - "\x02\x02\u0297\u029A\x054\x1B\x02\u0298\u029A\x056\x1C\x02\u0299\u0297" + - "\x03\x02\x02\x02\u0299\u0298\x03\x02\x02\x02\u029A3\x03\x02\x02\x02\u029B" + - "\u029C\x05:\x1E\x02\u029C\u029D\x07\x1B\x02\x02\u029D\u029E\x05(\x15\x02" + - "\u029E\u02AD\x03\x02\x02\x02\u029F\u02A0\x07A\x02\x02\u02A0\u02A5\x05" + - ":\x1E\x02\u02A1\u02A2\x07\n\x02\x02\u02A2\u02A4\x05:\x1E\x02\u02A3\u02A1" + - "\x03\x02\x02\x02\u02A4\u02A7\x03\x02\x02\x02\u02A5\u02A3\x03\x02\x02\x02" + - "\u02A5\u02A6\x03\x02\x02\x02\u02A6\u02A8\x03\x02\x02\x02\u02A7\u02A5\x03" + - "\x02\x02\x02\u02A8\u02A9\x07B\x02\x02\u02A9\u02AA\x07\x1B\x02\x02\u02AA" + - "\u02AB\x05(\x15\x02\u02AB\u02AD\x03\x02\x02\x02\u02AC\u029B\x03\x02\x02" + - "\x02\u02AC\u029F\x03\x02\x02\x02\u02AD5\x03\x02\x02\x02\u02AE\u02AF\x07" + - "A\x02\x02\u02AF\u02B0\x07A\x02\x02\u02B0\u02B3\x05:\x1E\x02\u02B1\u02B2" + - "\x07\n\x02\x02\u02B2\u02B4\x05:\x1E\x02\u02B3\u02B1\x03\x02\x02\x02\u02B4" + - "\u02B5\x03\x02\x02\x02\u02B5\u02B3\x03\x02\x02\x02\u02B5\u02B6\x03\x02" + - "\x02\x02\u02B6\u02B7\x03\x02\x02\x02\u02B7\u02B8\x07B\x02\x02\u02B8\u02B9" + - "\x07B\x02\x02\u02B9\u02BA\x07\x1B\x02\x02\u02BA\u02BB\x05(\x15\x02\u02BB" + - "7\x03\x02\x02\x02\u02BC\u02BF\x07\'\x02\x02\u02BD\u02BF\x05J&\x02\u02BE" + - "\u02BC\x03\x02\x02\x02\u02BE\u02BD\x03\x02\x02\x02\u02BF9\x03\x02\x02" + - "\x02\u02C0\u02C1\x058\x1D\x02\u02C1;\x03\x02\x02\x02\u02C2\u02C5\x077" + - "\x02\x02\u02C3\u02C5\x05J&\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C3" + - "\x03\x02\x02\x02\u02C5=\x03\x02\x02\x02\u02C6\u02CB\x05(\x15\x02\u02C7" + - "\u02C8\x07\n\x02\x02\u02C8\u02CA\x05(\x15\x02\u02C9\u02C7\x03\x02\x02" + - "\x02\u02CA\u02CD\x03\x02\x02\x02\u02CB\u02C9\x03\x02\x02\x02\u02CB\u02CC" + - "\x03\x02\x02\x02\u02CC?\x03\x02\x02\x02\u02CD\u02CB\x03\x02\x02\x02\u02CE" + - "\u02CF\x05L\'\x02\u02CF\u02D0\x07\x07\x02\x02\u02D0\u02D1\x05(\x15\x02" + - "\u02D1\u02D5\x03\x02\x02\x02\u02D2\u02D3\x07(\x02\x02\u02D3\u02D5\x05" + - "(\x15\x02\u02D4\u02CE\x03\x02\x02\x02\u02D4\u02D2\x03\x02\x02\x02\u02D5" + - "A\x03\x02\x02\x02\u02D6\u02D9\x05J&\x02\u02D7\u02D9\t\x05\x02\x02\u02D8" + - "\u02D6\x03\x02\x02\x02\u02D8\u02D7\x03\x02\x02\x02\u02D9C\x03\x02\x02" + - "\x02\u02DA\u02DD\x05J&\x02\u02DB\u02DD\t\x06\x02\x02\u02DC\u02DA\x03\x02" + - "\x02\x02\u02DC\u02DB\x03\x02\x02\x02\u02DDE\x03\x02\x02\x02\u02DE\u02DF" + - "\t\x07\x02\x02\u02DFG\x03\x02\x02\x02\u02E0\u02E1\t\b\x02\x02\u02E1I\x03" + - "\x02\x02\x02\u02E2\u02E7\x07C\x02\x02\u02E3\u02E4\x07)\x02\x02\u02E4\u02E6" + - "\x07C\x02\x02\u02E5\u02E3\x03\x02\x02\x02\u02E6\u02E9\x03\x02\x02\x02" + - "\u02E7\u02E5\x03\x02\x02\x02\u02E7\u02E8\x03\x02\x02\x02\u02E8K\x03\x02" + - "\x02\x02\u02E9\u02E7\x03\x02\x02\x02\u02EA\u02EF\x07C\x02\x02\u02EB\u02EC" + - "\x05J&\x02\u02EC\u02ED\b\'\x01\x02\u02ED\u02EF\x03\x02\x02\x02\u02EE\u02EA" + - "\x03\x02\x02\x02\u02EE\u02EB\x03\x02\x02\x02\u02EFM\x03\x02\x02\x02TQ" + - "Xai\x82\x8C\x8F\x94\xA3\xAA\xAE\xB1\xBE\xC5\xC8\xCF\xD5\xDA\xE5\xED\xF3" + - "\xF7\xF9\u0104\u0106\u0115\u011D\u012C\u0134\u0136\u0147\u014A\u014D\u0164" + - "\u0168\u0178\u0180\u0182\u018C\u0196\u0198\u019C\u01A5\u01B7\u01BB\u01C6" + - "\u01CA\u01D6\u01DA\u01E5\u01E9\u01F1\u01FB\u01FF\u0209\u020D\u0217\u021A" + - "\u021D\u0236\u025D\u0260\u0267\u0269\u0270\u0277\u027E\u0287\u028A\u0295" + - "\u0299\u02A5\u02AC\u02B5\u02BE\u02C4\u02CB\u02D4\u02D8\u02DC\u02E7\u02EE"; + "\u01F0\u01F1\x07\x04\x02\x02\u01F1\u01F6\x05,\x17\x02\u01F2\u01F3\x07" + + "\n\x02\x02\u01F3\u01F5\x05,\x17\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5" + + "\u01F8\x03\x02\x02\x02\u01F6\u01F4\x03\x02\x02\x02\u01F6\u01F7\x03\x02" + + "\x02\x02\u01F7\u01FA\x03\x02\x02\x02\u01F8\u01F6\x03\x02\x02\x02\u01F9" + + "\u01FB\x07\n\x02\x02\u01FA\u01F9\x03\x02\x02\x02\u01FA\u01FB\x03\x02\x02" + + "\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC\u01FD\x07\x05\x02\x02\u01FD\u0256" + + "\x03\x02\x02\x02\u01FE\u01FF\x07$\x02\x02\u01FF\u0200\x07\x04\x02\x02" + + "\u0200\u0205\x05,\x17\x02\u0201\u0202\x07\n\x02\x02\u0202\u0204\x05,\x17" + + "\x02\u0203\u0201\x03\x02\x02\x02\u0204\u0207\x03\x02\x02\x02\u0205\u0203" + + "\x03\x02\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0209\x03\x02\x02\x02" + + "\u0207\u0205\x03\x02\x02\x02\u0208\u020A\x07\n\x02\x02\u0209\u0208\x03" + + "\x02\x02\x02\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B" + + "\u020C\x07\x05\x02\x02\u020C\u0256\x03\x02\x02\x02\u020D\u0212\x05P)\x02" + + "\u020E\u0212\x07,\x02\x02\u020F\u0212\x07+\x02\x02\u0210\u0212\x07*\x02" + + "\x02\u0211\u020D\x03\x02\x02\x02\u0211\u020E\x03\x02\x02\x02\u0211\u020F" + + "\x03\x02\x02\x02\u0211\u0210\x03\x02\x02\x02\u0212\u0256\x03\x02\x02\x02" + + "\u0213\u0214\x07?\x02\x02\u0214\u0215\x05,\x17\x02\u0215\u0216\x07\n\x02" + + "\x02\u0216\u021B\x05,\x17\x02\u0217\u0218\x07\n\x02\x02\u0218\u021A\x05" + + ",\x17\x02\u0219\u0217\x03\x02\x02\x02\u021A\u021D\x03\x02\x02\x02\u021B" + + "\u0219\x03\x02\x02\x02\u021B\u021C\x03\x02\x02\x02\u021C\u021F\x03\x02" + + "\x02\x02\u021D\u021B\x03\x02\x02\x02\u021E\u0220\x07\n\x02\x02\u021F\u021E" + + "\x03\x02\x02\x02\u021F\u0220\x03\x02\x02\x02\u0220\u0221\x03\x02\x02\x02" + + "\u0221\u0222\x07@\x02\x02\u0222\u0256\x03\x02\x02\x02\u0223\u0224\x07" + + "?\x02\x02\u0224\u0256\x07@\x02\x02\u0225\u0226\x07\x04\x02\x02\u0226\u022B" + + "\x05F$\x02\u0227\u0228\x07\n\x02\x02\u0228\u022A\x05F$\x02\u0229\u0227" + + "\x03\x02\x02\x02\u022A\u022D\x03\x02\x02\x02\u022B\u0229\x03\x02\x02\x02" + + "\u022B\u022C\x03\x02\x02\x02\u022C\u022F\x03\x02\x02\x02\u022D\u022B\x03" + + "\x02\x02\x02\u022E\u0230\x07\n\x02\x02\u022F\u022E\x03\x02\x02\x02\u022F" + + "\u0230\x03\x02\x02\x02\u0230\u0231\x03\x02\x02\x02\u0231\u0232\x07\x05" + + "\x02\x02\u0232\u0256\x03\x02\x02\x02\u0233\u023C\x07\r\x02\x02\u0234\u0239" + + "\x05,\x17\x02\u0235\u0236\x07\n\x02\x02\u0236\u0238\x05,\x17\x02\u0237" + + "\u0235\x03\x02\x02\x02\u0238\u023B\x03\x02\x02\x02\u0239\u0237\x03\x02" + + "\x02\x02\u0239\u023A\x03\x02\x02\x02\u023A\u023D\x03\x02\x02\x02\u023B" + + "\u0239\x03\x02\x02\x02\u023C\u0234\x03\x02\x02\x02\u023C\u023D\x03\x02" + + "\x02\x02\u023D\u023F\x03\x02\x02\x02\u023E\u0240\x07\n\x02\x02\u023F\u023E" + + "\x03\x02\x02\x02\u023F\u0240\x03\x02\x02\x02\u0240\u0241\x03\x02\x02\x02" + + "\u0241\u0256\x07\x0E\x02\x02\u0242\u0243\x07%\x02\x02\u0243\u0244\x07" + + "?\x02\x02\u0244\u0245\x05,\x17\x02\u0245\u0246\x07@\x02\x02\u0246\u0247" + + "\x05,\x17\x02\u0247\u0248\x07&\x02\x02\u0248\u0249\x05,\x17\x06\u0249" + + "\u0256\x03\x02\x02\x02\u024A\u024B\x05\n\x06\x02\u024B\u024C\x05,\x17" + + "\x05\u024C\u0256\x03\x02\x02\x02\u024D\u024E\x07?\x02\x02\u024E\u024F" + + "\x05,\x17\x02\u024F\u0250\x07@\x02\x02\u0250\u0256\x03\x02\x02\x02\u0251" + + "\u0252\x07\x04\x02\x02\u0252\u0253\x05,\x17\x02\u0253\u0254\x07\x05\x02" + + "\x02\u0254\u0256\x03\x02\x02\x02\u0255\u01C0\x03\x02\x02\x02\u0255\u01C2" + + "\x03\x02\x02\x02\u0255\u01C9\x03\x02\x02\x02\u0255\u01CB\x03\x02\x02\x02" + + "\u0255\u01D0\x03\x02\x02\x02\u0255\u01DF\x03\x02\x02\x02\u0255\u01EE\x03" + + "\x02\x02\x02\u0255\u01EF\x03\x02\x02\x02\u0255\u01FE\x03\x02\x02\x02\u0255" + + "\u0211\x03\x02\x02\x02\u0255\u0213\x03\x02\x02\x02\u0255\u0223\x03\x02" + + "\x02\x02\u0255\u0225\x03\x02\x02\x02\u0255\u0233\x03\x02\x02\x02\u0255" + + "\u0242\x03\x02\x02\x02\u0255\u024A\x03\x02\x02\x02\u0255\u024D\x03\x02" + + "\x02\x02\u0255\u0251\x03\x02\x02\x02\u0256\u0288\x03\x02\x02\x02\u0257" + + "\u0258\f\x1C\x02\x02\u0258\u0259\x07!\x02\x02\u0259\u0287\x05,\x17\x1C" + + "\u025A\u025B\f\x1A\x02\x02\u025B\u025C\t\x02\x02\x02\u025C\u0287\x05," + + "\x17\x1B\u025D\u025E\f\x19\x02\x02\u025E\u025F\t\x03\x02\x02\u025F\u0287" + + "\x05,\x17\x1A\u0260\u0261\f\x18\x02\x02\u0261\u0262\t\x04\x02\x02\u0262" + + "\u0287\x05,\x17\x19\u0263\u0264\f\x16\x02\x02\u0264\u0265\x07>\x02\x02" + + "\u0265\u0266\x05,\x17\x17\u0266\u0267\b\x17\x01\x02\u0267\u0287\x03\x02" + + "\x02\x02\u0268\u0269\f\x14\x02\x02\u0269\u026A\x07-\x02\x02\u026A\u0287" + + "\x05,\x17\x15\u026B\u026C\f\x12\x02\x02\u026C\u026D\x07.\x02\x02\u026D" + + "\u0287\x05,\x17\x13\u026E\u026F\f\x11\x02\x02\u026F\u0270\x07/\x02\x02" + + "\u0270\u0287\x05,\x17\x12\u0271\u0272\f\x10\x02\x02\u0272\u0273\x070\x02" + + "\x02\u0273\u0287\x05,\x17\x11\u0274\u0275\f\t\x02\x02\u0275\u0276\x07" + + "\x1C\x02\x02\u0276\u0287\x05,\x17\n\u0277\u0278\f \x02\x02\u0278\u0279" + + "\x07\x18\x02\x02\u0279\u027F\x05J&\x02\u027A\u027C\x07?\x02\x02\u027B" + + "\u027D\x05D#\x02\u027C\u027B\x03\x02\x02\x02\u027C\u027D\x03\x02\x02\x02" + + "\u027D\u027E\x03\x02\x02\x02\u027E\u0280\x07@\x02\x02\u027F\u027A\x03" + + "\x02\x02\x02\u027F\u0280\x03\x02\x02\x02\u0280\u0287\x03\x02\x02\x02\u0281" + + "\u0282\f\x1D\x02\x02\u0282\u0283\x07\r\x02\x02\u0283\u0284\x05,\x17\x02" + + "\u0284\u0285\x07\x0E\x02\x02\u0285\u0287\x03\x02\x02\x02\u0286\u0257\x03" + + "\x02\x02\x02\u0286\u025A\x03\x02\x02\x02\u0286\u025D\x03\x02\x02\x02\u0286" + + "\u0260\x03\x02\x02\x02\u0286\u0263\x03\x02\x02\x02\u0286\u0268\x03\x02" + + "\x02\x02\u0286\u026B\x03\x02\x02\x02\u0286\u026E\x03\x02\x02\x02\u0286" + + "\u0271\x03\x02\x02\x02\u0286\u0274\x03\x02\x02\x02\u0286\u0277\x03\x02" + + "\x02\x02\u0286\u0281\x03\x02\x02\x02\u0287\u028A\x03\x02\x02\x02\u0288" + + "\u0286\x03\x02\x02\x02\u0288\u0289\x03\x02\x02\x02\u0289-\x03\x02\x02" + + "\x02\u028A\u0288\x03\x02\x02\x02\u028B\u028C\x072\x02\x02\u028C\u028D" + + "\x05,\x17\x02\u028D\u028F\x07\x04\x02\x02\u028E\u0290\x07\x0F\x02\x02" + + "\u028F\u028E\x03\x02\x02\x02\u028F\u0290\x03\x02\x02\x02\u0290\u0291\x03" + + "\x02\x02\x02\u0291\u0296\x050\x19\x02\u0292\u0293\x07\x0F\x02\x02\u0293" + + "\u0295\x050\x19\x02\u0294\u0292\x03\x02\x02\x02\u0295\u0298\x03\x02\x02" + + "\x02\u0296\u0294\x03\x02\x02\x02\u0296\u0297\x03\x02\x02\x02\u0297\u0299" + + "\x03\x02\x02\x02\u0298\u0296\x03\x02\x02\x02\u0299\u029A\x07\x05\x02\x02" + + "\u029A/\x03\x02\x02\x02\u029B\u029E\x052\x1A\x02\u029C\u029E\x07\'\x02" + + "\x02\u029D\u029B\x03\x02\x02\x02\u029D\u029C\x03\x02\x02\x02\u029E\u029F" + + "\x03\x02\x02\x02\u029F\u02A0\x07\x1D\x02\x02\u02A0\u02A1\x05,\x17\x02" + + "\u02A11\x03\x02\x02\x02\u02A2\u02A9\x05R*\x02\u02A3\u02A6\x07?\x02\x02" + + "\u02A4\u02A7\x05R*\x02\u02A5\u02A7\x07\'\x02\x02\u02A6\u02A4\x03\x02\x02" + + "\x02\u02A6\u02A5\x03\x02\x02\x02\u02A7\u02A8\x03\x02\x02\x02\u02A8\u02AA" + + "\x07@\x02\x02\u02A9\u02A3\x03\x02\x02\x02\u02A9\u02AA\x03\x02\x02\x02" + + "\u02AA3\x03\x02\x02\x02\u02AB\u02AC\x05\b\x05\x02\u02AC\u02AD\x07\x02" + + "\x02\x03\u02AD\u02B5\x03\x02\x02\x02\u02AE\u02AF\x05,\x17\x02\u02AF\u02B0" + + "\x07\x02\x02\x03\u02B0\u02B5\x03\x02\x02\x02\u02B1\u02B2\x07E\x02\x02" + + "\u02B2\u02B5\x07\x02\x02\x03\u02B3\u02B5\x07\x02\x02\x03\u02B4\u02AB\x03" + + "\x02\x02\x02\u02B4\u02AE\x03\x02\x02\x02\u02B4\u02B1\x03\x02\x02\x02\u02B4" + + "\u02B3\x03\x02\x02\x02\u02B55\x03\x02\x02\x02\u02B6\u02B9\x058\x1D\x02" + + "\u02B7\u02B9\x05:\x1E\x02\u02B8\u02B6\x03\x02\x02\x02\u02B8\u02B7\x03" + + "\x02\x02\x02\u02B97\x03\x02\x02\x02\u02BA\u02BB\x05> \x02\u02BB\u02BC" + + "\x07\x1D\x02\x02\u02BC\u02BD\x05,\x17\x02\u02BD\u02CC\x03\x02\x02\x02" + + "\u02BE\u02BF\x07?\x02\x02\u02BF\u02C4\x05> \x02\u02C0\u02C1\x07\n\x02" + + "\x02\u02C1\u02C3\x05> \x02\u02C2\u02C0\x03\x02\x02\x02\u02C3\u02C6\x03" + + "\x02\x02\x02\u02C4\u02C2\x03\x02\x02\x02\u02C4\u02C5\x03\x02\x02\x02\u02C5" + + "\u02C7\x03\x02\x02\x02\u02C6\u02C4\x03\x02\x02\x02\u02C7\u02C8\x07@\x02" + + "\x02\u02C8\u02C9\x07\x1D\x02\x02\u02C9\u02CA\x05,\x17\x02\u02CA\u02CC" + + "\x03\x02\x02\x02\u02CB\u02BA\x03\x02\x02\x02\u02CB\u02BE\x03\x02\x02\x02" + + "\u02CC9\x03\x02\x02\x02\u02CD\u02CE\x07?\x02\x02\u02CE\u02CF\x07?\x02" + + "\x02\u02CF\u02D2\x05> \x02\u02D0\u02D1\x07\n\x02\x02\u02D1\u02D3\x05>" + + " \x02\u02D2\u02D0\x03\x02\x02\x02\u02D3\u02D4\x03\x02\x02\x02\u02D4\u02D2" + + "\x03\x02\x02\x02\u02D4\u02D5\x03\x02\x02\x02\u02D5\u02D6\x03\x02\x02\x02" + + "\u02D6\u02D7\x07@\x02\x02\u02D7\u02D8\x07@\x02\x02\u02D8\u02D9\x07\x1D" + + "\x02\x02\u02D9\u02DA\x05,\x17\x02\u02DA;\x03\x02\x02\x02\u02DB\u02DE\x07" + + "\'\x02\x02\u02DC\u02DE\x05P)\x02\u02DD\u02DB\x03\x02\x02\x02\u02DD\u02DC" + + "\x03\x02\x02\x02\u02DE=\x03\x02\x02\x02\u02DF\u02E0\x05<\x1F\x02\u02E0" + + "?\x03\x02\x02\x02\u02E1\u02E2\x05<\x1F\x02\u02E2\u02E3\x07\x07\x02\x02" + + "\u02E3\u02E4\x05$\x13\x02\u02E4A\x03\x02\x02\x02\u02E5\u02E8\x075\x02" + + "\x02\u02E6\u02E8\x05P)\x02\u02E7\u02E5\x03\x02\x02\x02\u02E7\u02E6\x03" + + "\x02\x02\x02\u02E8C\x03\x02\x02\x02\u02E9\u02EE\x05,\x17\x02\u02EA\u02EB" + + "\x07\n\x02\x02\u02EB\u02ED\x05,\x17\x02\u02EC\u02EA\x03\x02\x02\x02\u02ED" + + "\u02F0\x03\x02\x02\x02\u02EE\u02EC\x03\x02\x02\x02\u02EE\u02EF\x03\x02" + + "\x02\x02\u02EFE\x03\x02\x02\x02\u02F0\u02EE\x03\x02\x02\x02\u02F1\u02F2" + + "\x05R*\x02\u02F2\u02F3\x07\x07\x02\x02\u02F3\u02F4\x05,\x17\x02\u02F4" + + "\u02F8\x03\x02\x02\x02\u02F5\u02F6\x07(\x02\x02\u02F6\u02F8\x05,\x17\x02" + + "\u02F7\u02F1\x03\x02\x02\x02\u02F7\u02F5\x03\x02\x02\x02\u02F8G\x03\x02" + + "\x02\x02\u02F9\u02FC\x05P)\x02\u02FA\u02FC\t\x05\x02\x02\u02FB\u02F9\x03" + + "\x02\x02\x02\u02FB\u02FA\x03\x02\x02\x02\u02FCI\x03\x02\x02\x02\u02FD" + + "\u0300\x05P)\x02\u02FE\u0300\t\x06\x02\x02\u02FF\u02FD\x03\x02\x02\x02" + + "\u02FF\u02FE\x03\x02\x02\x02\u0300K\x03\x02\x02\x02\u0301\u0302\t\x07" + + "\x02\x02\u0302M\x03\x02\x02\x02\u0303\u0304\t\b\x02\x02\u0304O\x03\x02" + + "\x02\x02\u0305\u030A\x05T+\x02\u0306\u0307\x07)\x02\x02\u0307\u0309\x05" + + "T+\x02\u0308\u0306\x03\x02\x02\x02\u0309\u030C\x03\x02\x02\x02\u030A\u0308" + + "\x03\x02\x02\x02\u030A\u030B\x03\x02\x02\x02\u030BQ\x03\x02\x02\x02\u030C" + + "\u030A\x03\x02\x02\x02\u030D\u0312\x05T+\x02\u030E\u030F\x05P)\x02\u030F" + + "\u0310\b*\x01\x02\u0310\u0312\x03\x02\x02\x02\u0311\u030D\x03\x02\x02" + + "\x02\u0311\u030E\x03\x02\x02\x02\u0312S\x03\x02\x02\x02\u0313\u0314\t" + + "\t\x02\x02\u0314U\x03\x02\x02\x02XY`iq\x8A\x94\x9C\x9F\xA9\xAC\xAF\xB3" + + "\xB7\xBA\xBC\xCA\xD3\xD7\xDA\xE1\xE9\xF5\xFD\u0103\u0107\u0109\u0114\u0116" + + "\u0125\u012D\u013C\u0144\u0146\u0157\u015A\u015D\u0176\u017A\u0180\u0193" + + "\u0198\u01A0\u01A2\u01B2\u01B8\u01BC\u01C5\u01D7\u01DB\u01E6\u01EA\u01F6" + + "\u01FA\u0205\u0209\u0211\u021B\u021F\u022B\u022F\u0239\u023C\u023F\u0255" + + "\u027C\u027F\u0286\u0288\u028F\u0296\u029D\u02A6\u02A9\u02B4\u02B8\u02C4" + + "\u02CB\u02D4\u02DD\u02E7\u02EE\u02F7\u02FB\u02FF\u030A\u0311"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -4018,13 +4261,14 @@ export class VarContext extends DeclarationContext { } } export class AssumeContext extends DeclarationContext { - public identOrHole(): IdentOrHoleContext { - return this.getRuleContext(0, IdentOrHoleContext); - } + public _assumeName!: IdentOrHoleContext; public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public expr(): ExprContext { return this.getRuleContext(0, ExprContext); } + public identOrHole(): IdentOrHoleContext | undefined { + return this.tryGetRuleContext(0, IdentOrHoleContext); + } constructor(ctx: DeclarationContext) { super(ctx.parent, ctx.invokingState); this.copyFrom(ctx); @@ -4198,27 +4442,86 @@ export class ExportDefContext extends DeclarationContext { export class OperDefContext extends ParserRuleContext { + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_operDef; } + public copyFrom(ctx: OperDefContext): void { + super.copyFrom(ctx); + } +} +export class AnnotatedOperDefContext extends OperDefContext { + public _annotatedParameter!: AnnotatedParameterContext; + public _annotOperParam: AnnotatedParameterContext[] = []; public qualifier(): QualifierContext { return this.getRuleContext(0, QualifierContext); } public normalCallName(): NormalCallNameContext { return this.getRuleContext(0, NormalCallNameContext); } - public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } - public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } - public type(): TypeContext[]; - public type(i: number): TypeContext; - public type(i?: number): TypeContext | TypeContext[] { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + public type(): TypeContext { + return this.getRuleContext(0, TypeContext); + } + public annotatedParameter(): AnnotatedParameterContext[]; + public annotatedParameter(i: number): AnnotatedParameterContext; + public annotatedParameter(i?: number): AnnotatedParameterContext | AnnotatedParameterContext[] { if (i === undefined) { - return this.getRuleContexts(TypeContext); + return this.getRuleContexts(AnnotatedParameterContext); } else { - return this.getRuleContext(i, TypeContext); + return this.getRuleContext(i, AnnotatedParameterContext); + } + } + public ASGN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.ASGN, 0); } + public expr(): ExprContext | undefined { + return this.tryGetRuleContext(0, ExprContext); + } + constructor(ctx: OperDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterAnnotatedOperDef) { + listener.enterAnnotatedOperDef(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitAnnotatedOperDef) { + listener.exitAnnotatedOperDef(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitAnnotatedOperDef) { + return visitor.visitAnnotatedOperDef(this); + } else { + return visitor.visitChildren(this); } } +} +export class DeprecatedOperDefContext extends OperDefContext { + public _parameter!: ParameterContext; + public _operParam: ParameterContext[] = []; + public _annotatedRetType!: TypeContext; + public qualifier(): QualifierContext { + return this.getRuleContext(0, QualifierContext); + } + public normalCallName(): NormalCallNameContext { + return this.getRuleContext(0, NormalCallNameContext); + } + public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } public ASGN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.ASGN, 0); } public expr(): ExprContext | undefined { return this.tryGetRuleContext(0, ExprContext); } + public type(): TypeContext | undefined { + return this.tryGetRuleContext(0, TypeContext); + } public parameter(): ParameterContext[]; public parameter(i: number): ParameterContext; public parameter(i?: number): ParameterContext | ParameterContext[] { @@ -4228,27 +4531,26 @@ export class OperDefContext extends ParserRuleContext { return this.getRuleContext(i, ParameterContext); } } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + constructor(ctx: OperDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); } // @Override - public get ruleIndex(): number { return QuintParser.RULE_operDef; } - // @Override public enterRule(listener: QuintListener): void { - if (listener.enterOperDef) { - listener.enterOperDef(this); + if (listener.enterDeprecatedOperDef) { + listener.enterDeprecatedOperDef(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitOperDef) { - listener.exitOperDef(this); + if (listener.exitDeprecatedOperDef) { + listener.exitDeprecatedOperDef(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitOperDef) { - return visitor.visitOperDef(this); + if (visitor.visitDeprecatedOperDef) { + return visitor.visitDeprecatedOperDef(this); } else { return visitor.visitChildren(this); } @@ -4296,41 +4598,118 @@ export class TypeAbstractDefContext extends TypeDefContext { } } export class TypeAliasDefContext extends TypeDefContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); } public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } public type(): TypeContext { return this.getRuleContext(0, TypeContext); } - constructor(ctx: TypeDefContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + constructor(ctx: TypeDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeAliasDef) { + listener.enterTypeAliasDef(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeAliasDef) { + listener.exitTypeAliasDef(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeAliasDef) { + return visitor.visitTypeAliasDef(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class TypeSumDefContext extends TypeDefContext { + public typeDefHead(): TypeDefHeadContext { + return this.getRuleContext(0, TypeDefHeadContext); + } + public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } + public sumTypeDefinition(): SumTypeDefinitionContext { + return this.getRuleContext(0, SumTypeDefinitionContext); + } + constructor(ctx: TypeDefContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeSumDef) { + listener.enterTypeSumDef(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeSumDef) { + listener.exitTypeSumDef(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeSumDef) { + return visitor.visitTypeSumDef(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeDefHeadContext extends ParserRuleContext { + public _typeName!: QualIdContext; + public _LOW_ID!: Token; + public _typeVars: Token[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } + public LOW_ID(): TerminalNode[]; + public LOW_ID(i: number): TerminalNode; + public LOW_ID(i?: number): TerminalNode | TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuintParser.LOW_ID); + } else { + return this.getToken(QuintParser.LOW_ID, i); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); } // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeDefHead; } + // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeAliasDef) { - listener.enterTypeAliasDef(this); + if (listener.enterTypeDefHead) { + listener.enterTypeDefHead(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeAliasDef) { - listener.exitTypeAliasDef(this); + if (listener.exitTypeDefHead) { + listener.exitTypeDefHead(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeAliasDef) { - return visitor.visitTypeAliasDef(this); + if (visitor.visitTypeDefHead) { + return visitor.visitTypeDefHead(this); } else { return visitor.visitChildren(this); } } } -export class TypeSumDefContext extends TypeDefContext { - public _typeName!: QualIdContext; - public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } + + +export class SumTypeDefinitionContext extends ParserRuleContext { public typeSumVariant(): TypeSumVariantContext[]; public typeSumVariant(i: number): TypeSumVariantContext; public typeSumVariant(i?: number): TypeSumVariantContext | TypeSumVariantContext[] { @@ -4340,29 +4719,27 @@ export class TypeSumDefContext extends TypeDefContext { return this.getRuleContext(i, TypeSumVariantContext); } } - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); - } - constructor(ctx: TypeDefContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); } // @Override + public get ruleIndex(): number { return QuintParser.RULE_sumTypeDefinition; } + // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeSumDef) { - listener.enterTypeSumDef(this); + if (listener.enterSumTypeDefinition) { + listener.enterSumTypeDefinition(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeSumDef) { - listener.exitTypeSumDef(this); + if (listener.exitSumTypeDefinition) { + listener.exitSumTypeDefinition(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeSumDef) { - return visitor.visitTypeSumDef(this); + if (visitor.visitSumTypeDefinition) { + return visitor.visitSumTypeDefinition(this); } else { return visitor.visitChildren(this); } @@ -4408,45 +4785,6 @@ export class TypeSumVariantContext extends ParserRuleContext { } -export class NondetOperDefContext extends ParserRuleContext { - public qualId(): QualIdContext { - return this.getRuleContext(0, QualIdContext); - } - public ASGN(): TerminalNode { return this.getToken(QuintParser.ASGN, 0); } - public expr(): ExprContext { - return this.getRuleContext(0, ExprContext); - } - public type(): TypeContext | undefined { - return this.tryGetRuleContext(0, TypeContext); - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); - } - // @Override - public get ruleIndex(): number { return QuintParser.RULE_nondetOperDef; } - // @Override - public enterRule(listener: QuintListener): void { - if (listener.enterNondetOperDef) { - listener.enterNondetOperDef(this); - } - } - // @Override - public exitRule(listener: QuintListener): void { - if (listener.exitNondetOperDef) { - listener.exitNondetOperDef(this); - } - } - // @Override - public accept(visitor: QuintVisitor): Result { - if (visitor.visitNondetOperDef) { - return visitor.visitNondetOperDef(this); - } else { - return visitor.visitChildren(this); - } - } -} - - export class QualifierContext extends ParserRuleContext { constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); @@ -4897,6 +5235,34 @@ export class TypeListContext extends TypeContext { } } } +export class TypeUnitContext extends TypeContext { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeUnit) { + listener.enterTypeUnit(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeUnit) { + listener.exitTypeUnit(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeUnit) { + return visitor.visitTypeUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} export class TypeTupleContext extends TypeContext { public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } public type(): TypeContext[]; @@ -4935,8 +5301,8 @@ export class TypeTupleContext extends TypeContext { } } export class TypeRecContext extends TypeContext { - public row(): RowContext { - return this.getRuleContext(0, RowContext); + public row(): RowContext | undefined { + return this.tryGetRuleContext(0, RowContext); } constructor(ctx: TypeContext) { super(ctx.parent, ctx.invokingState); @@ -5041,7 +5407,36 @@ export class TypeBoolContext extends TypeContext { } } } -export class TypeConstOrVarContext extends TypeContext { +export class TypeVarCaseContext extends TypeContext { + public typeVar(): TypeVarContext { + return this.getRuleContext(0, TypeVarContext); + } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVarCase) { + listener.enterTypeVarCase(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVarCase) { + listener.exitTypeVarCase(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVarCase) { + return visitor.visitTypeVarCase(this); + } else { + return visitor.visitChildren(this); + } + } +} +export class TypeConstContext extends TypeContext { public qualId(): QualIdContext { return this.getRuleContext(0, QualIdContext); } @@ -5051,20 +5446,20 @@ export class TypeConstOrVarContext extends TypeContext { } // @Override public enterRule(listener: QuintListener): void { - if (listener.enterTypeConstOrVar) { - listener.enterTypeConstOrVar(this); + if (listener.enterTypeConst) { + listener.enterTypeConst(this); } } // @Override public exitRule(listener: QuintListener): void { - if (listener.exitTypeConstOrVar) { - listener.exitTypeConstOrVar(this); + if (listener.exitTypeConst) { + listener.exitTypeConst(this); } } // @Override public accept(visitor: QuintVisitor): Result { - if (visitor.visitTypeConstOrVar) { - return visitor.visitTypeConstOrVar(this); + if (visitor.visitTypeConst) { + return visitor.visitTypeConst(this); } else { return visitor.visitChildren(this); } @@ -5101,10 +5496,81 @@ export class TypeParenContext extends TypeContext { } } } +export class TypeAppContext extends TypeContext { + public _typeCtor!: QualIdContext; + public _type!: TypeContext; + public _typeArg: TypeContext[] = []; + public qualId(): QualIdContext { + return this.getRuleContext(0, QualIdContext); + } + public type(): TypeContext[]; + public type(i: number): TypeContext; + public type(i?: number): TypeContext | TypeContext[] { + if (i === undefined) { + return this.getRuleContexts(TypeContext); + } else { + return this.getRuleContext(i, TypeContext); + } + } + constructor(ctx: TypeContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeApp) { + listener.enterTypeApp(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeApp) { + listener.exitTypeApp(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeApp) { + return visitor.visitTypeApp(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class TypeVarContext extends ParserRuleContext { + public LOW_ID(): TerminalNode { return this.getToken(QuintParser.LOW_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_typeVar; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterTypeVar) { + listener.enterTypeVar(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitTypeVar) { + listener.exitTypeVar(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitTypeVar) { + return visitor.visitTypeVar(this); + } else { + return visitor.visitChildren(this); + } + } +} export class RowContext extends ParserRuleContext { - public _rowVar!: Token; + public _rowVar!: IdentifierContext; public rowLabel(): RowLabelContext[]; public rowLabel(i: number): RowLabelContext; public rowLabel(i?: number): RowLabelContext | RowLabelContext[] { @@ -5123,7 +5589,9 @@ export class RowContext extends ParserRuleContext { return this.getRuleContext(i, TypeContext); } } - public IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(QuintParser.IDENTIFIER, 0); } + public identifier(): IdentifierContext | undefined { + return this.tryGetRuleContext(0, IdentifierContext); + } constructor(parent: ParserRuleContext | undefined, invokingState: number) { super(parent, invokingState); } @@ -5967,6 +6435,34 @@ export class TupleContext extends ExprContext { } } } +export class UnitContext extends ExprContext { + public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode { return this.getToken(QuintParser.RPAREN, 0); } + constructor(ctx: ExprContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterUnit) { + listener.enterUnit(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitUnit) { + listener.exitUnit(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitUnit) { + return visitor.visitUnit(this); + } else { + return visitor.visitChildren(this); + } + } +} export class PairContext extends ExprContext { public expr(): ExprContext[]; public expr(i: number): ExprContext; @@ -6141,38 +6637,6 @@ export class LetInContext extends ExprContext { } } } -export class NondetContext extends ExprContext { - public nondetOperDef(): NondetOperDefContext { - return this.getRuleContext(0, NondetOperDefContext); - } - public expr(): ExprContext { - return this.getRuleContext(0, ExprContext); - } - constructor(ctx: ExprContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); - } - // @Override - public enterRule(listener: QuintListener): void { - if (listener.enterNondet) { - listener.enterNondet(this); - } - } - // @Override - public exitRule(listener: QuintListener): void { - if (listener.exitNondet) { - listener.exitNondet(this); - } - } - // @Override - public accept(visitor: QuintVisitor): Result { - if (visitor.visitNondet) { - return visitor.visitNondet(this); - } else { - return visitor.visitChildren(this); - } - } -} export class ParenContext extends ExprContext { public LPAREN(): TerminalNode { return this.getToken(QuintParser.LPAREN, 0); } public expr(): ExprContext { @@ -6565,6 +7029,7 @@ export class IdentOrHoleContext extends ParserRuleContext { export class ParameterContext extends ParserRuleContext { + public _paramName!: IdentOrHoleContext; public identOrHole(): IdentOrHoleContext { return this.getRuleContext(0, IdentOrHoleContext); } @@ -6596,6 +7061,42 @@ export class ParameterContext extends ParserRuleContext { } +export class AnnotatedParameterContext extends ParserRuleContext { + public _paramName!: IdentOrHoleContext; + public type(): TypeContext { + return this.getRuleContext(0, TypeContext); + } + public identOrHole(): IdentOrHoleContext { + return this.getRuleContext(0, IdentOrHoleContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_annotatedParameter; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterAnnotatedParameter) { + listener.enterAnnotatedParameter(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitAnnotatedParameter) { + listener.exitAnnotatedParameter(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitAnnotatedParameter) { + return visitor.visitAnnotatedParameter(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class IdentOrStarContext extends ParserRuleContext { public MUL(): TerminalNode | undefined { return this.tryGetToken(QuintParser.MUL, 0); } public qualId(): QualIdContext | undefined { @@ -6856,13 +7357,13 @@ export class LiteralContext extends ParserRuleContext { export class QualIdContext extends ParserRuleContext { - public IDENTIFIER(): TerminalNode[]; - public IDENTIFIER(i: number): TerminalNode; - public IDENTIFIER(i?: number): TerminalNode | TerminalNode[] { + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext; + public identifier(i?: number): IdentifierContext | IdentifierContext[] { if (i === undefined) { - return this.getTokens(QuintParser.IDENTIFIER); + return this.getRuleContexts(IdentifierContext); } else { - return this.getToken(QuintParser.IDENTIFIER, i); + return this.getRuleContext(i, IdentifierContext); } } constructor(parent: ParserRuleContext | undefined, invokingState: number) { @@ -6896,7 +7397,9 @@ export class QualIdContext extends ParserRuleContext { export class SimpleIdContext extends ParserRuleContext { public context: string; public _qualId!: QualIdContext; - public IDENTIFIER(): TerminalNode | undefined { return this.tryGetToken(QuintParser.IDENTIFIER, 0); } + public identifier(): IdentifierContext | undefined { + return this.tryGetRuleContext(0, IdentifierContext); + } public qualId(): QualIdContext | undefined { return this.tryGetRuleContext(0, QualIdContext); } @@ -6929,3 +7432,34 @@ export class SimpleIdContext extends ParserRuleContext { } +export class IdentifierContext extends ParserRuleContext { + public LOW_ID(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LOW_ID, 0); } + public CAP_ID(): TerminalNode | undefined { return this.tryGetToken(QuintParser.CAP_ID, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_identifier; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterIdentifier) { + listener.enterIdentifier(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitIdentifier) { + listener.exitIdentifier(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitIdentifier) { + return visitor.visitIdentifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + + diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 2c31cc191..f8a3bbb4c 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -13,13 +13,16 @@ import { TypeFunContext } from "./QuintParser"; import { TypeOperContext } from "./QuintParser"; import { TypeSetContext } from "./QuintParser"; import { TypeListContext } from "./QuintParser"; +import { TypeUnitContext } from "./QuintParser"; import { TypeTupleContext } from "./QuintParser"; import { TypeRecContext } from "./QuintParser"; import { TypeIntContext } from "./QuintParser"; import { TypeStrContext } from "./QuintParser"; import { TypeBoolContext } from "./QuintParser"; -import { TypeConstOrVarContext } from "./QuintParser"; +import { TypeVarCaseContext } from "./QuintParser"; +import { TypeConstContext } from "./QuintParser"; import { TypeParenContext } from "./QuintParser"; +import { TypeAppContext } from "./QuintParser"; import { TypeAbstractDefContext } from "./QuintParser"; import { TypeAliasDefContext } from "./QuintParser"; import { TypeSumDefContext } from "./QuintParser"; @@ -45,14 +48,16 @@ import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; import { LiteralOrIdContext } from "./QuintParser"; import { TupleContext } from "./QuintParser"; +import { UnitContext } from "./QuintParser"; import { PairContext } from "./QuintParser"; import { RecordContext } from "./QuintParser"; import { ListContext } from "./QuintParser"; import { IfElseContext } from "./QuintParser"; import { LetInContext } from "./QuintParser"; -import { NondetContext } from "./QuintParser"; import { ParenContext } from "./QuintParser"; import { BracesContext } from "./QuintParser"; +import { AnnotatedOperDefContext } from "./QuintParser"; +import { DeprecatedOperDefContext } from "./QuintParser"; import { ConstContext } from "./QuintParser"; import { VarContext } from "./QuintParser"; import { AssumeContext } from "./QuintParser"; @@ -67,8 +72,9 @@ import { DocumentedDeclarationContext } from "./QuintParser"; import { DeclarationContext } from "./QuintParser"; import { OperDefContext } from "./QuintParser"; import { TypeDefContext } from "./QuintParser"; +import { TypeDefHeadContext } from "./QuintParser"; +import { SumTypeDefinitionContext } from "./QuintParser"; import { TypeSumVariantContext } from "./QuintParser"; -import { NondetOperDefContext } from "./QuintParser"; import { QualifierContext } from "./QuintParser"; import { ImportModContext } from "./QuintParser"; import { ExportModContext } from "./QuintParser"; @@ -78,6 +84,7 @@ import { NameContext } from "./QuintParser"; import { QualifiedNameContext } from "./QuintParser"; import { FromSourceContext } from "./QuintParser"; import { TypeContext } from "./QuintParser"; +import { TypeVarContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; @@ -90,6 +97,7 @@ import { LambdaUnsugaredContext } from "./QuintParser"; import { LambdaTupleSugarContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; import { ParameterContext } from "./QuintParser"; +import { AnnotatedParameterContext } from "./QuintParser"; import { IdentOrStarContext } from "./QuintParser"; import { ArgListContext } from "./QuintParser"; import { RecElemContext } from "./QuintParser"; @@ -99,6 +107,7 @@ import { OperatorContext } from "./QuintParser"; import { LiteralContext } from "./QuintParser"; import { QualIdContext } from "./QuintParser"; import { SimpleIdContext } from "./QuintParser"; +import { IdentifierContext } from "./QuintParser"; /** @@ -141,6 +150,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeList?: (ctx: TypeListContext) => Result; + /** + * Visit a parse tree produced by the `typeUnit` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeUnit?: (ctx: TypeUnitContext) => Result; + /** * Visit a parse tree produced by the `typeTuple` * labeled alternative in `QuintParser.type`. @@ -182,12 +199,20 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeBool?: (ctx: TypeBoolContext) => Result; /** - * Visit a parse tree produced by the `typeConstOrVar` + * Visit a parse tree produced by the `typeVarCase` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeVarCase?: (ctx: TypeVarCaseContext) => Result; + + /** + * Visit a parse tree produced by the `typeConst` * labeled alternative in `QuintParser.type`. * @param ctx the parse tree * @return the visitor result */ - visitTypeConstOrVar?: (ctx: TypeConstOrVarContext) => Result; + visitTypeConst?: (ctx: TypeConstContext) => Result; /** * Visit a parse tree produced by the `typeParen` @@ -197,6 +222,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTypeParen?: (ctx: TypeParenContext) => Result; + /** + * Visit a parse tree produced by the `typeApp` + * labeled alternative in `QuintParser.type`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeApp?: (ctx: TypeAppContext) => Result; + /** * Visit a parse tree produced by the `typeAbstractDef` * labeled alternative in `QuintParser.typeDef`. @@ -397,6 +430,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitTuple?: (ctx: TupleContext) => Result; + /** + * Visit a parse tree produced by the `unit` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + * @return the visitor result + */ + visitUnit?: (ctx: UnitContext) => Result; + /** * Visit a parse tree produced by the `pair` * labeled alternative in `QuintParser.expr`. @@ -438,28 +479,36 @@ export interface QuintVisitor extends ParseTreeVisitor { visitLetIn?: (ctx: LetInContext) => Result; /** - * Visit a parse tree produced by the `nondet` + * Visit a parse tree produced by the `paren` * labeled alternative in `QuintParser.expr`. * @param ctx the parse tree * @return the visitor result */ - visitNondet?: (ctx: NondetContext) => Result; + visitParen?: (ctx: ParenContext) => Result; /** - * Visit a parse tree produced by the `paren` + * Visit a parse tree produced by the `braces` * labeled alternative in `QuintParser.expr`. * @param ctx the parse tree * @return the visitor result */ - visitParen?: (ctx: ParenContext) => Result; + visitBraces?: (ctx: BracesContext) => Result; /** - * Visit a parse tree produced by the `braces` - * labeled alternative in `QuintParser.expr`. + * Visit a parse tree produced by the `annotatedOperDef` + * labeled alternative in `QuintParser.operDef`. * @param ctx the parse tree * @return the visitor result */ - visitBraces?: (ctx: BracesContext) => Result; + visitAnnotatedOperDef?: (ctx: AnnotatedOperDefContext) => Result; + + /** + * Visit a parse tree produced by the `deprecatedOperDef` + * labeled alternative in `QuintParser.operDef`. + * @param ctx the parse tree + * @return the visitor result + */ + visitDeprecatedOperDef?: (ctx: DeprecatedOperDefContext) => Result; /** * Visit a parse tree produced by the `const` @@ -568,18 +617,25 @@ export interface QuintVisitor extends ParseTreeVisitor { visitTypeDef?: (ctx: TypeDefContext) => Result; /** - * Visit a parse tree produced by `QuintParser.typeSumVariant`. + * Visit a parse tree produced by `QuintParser.typeDefHead`. * @param ctx the parse tree * @return the visitor result */ - visitTypeSumVariant?: (ctx: TypeSumVariantContext) => Result; + visitTypeDefHead?: (ctx: TypeDefHeadContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.sumTypeDefinition`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSumTypeDefinition?: (ctx: SumTypeDefinitionContext) => Result; /** - * Visit a parse tree produced by `QuintParser.nondetOperDef`. + * Visit a parse tree produced by `QuintParser.typeSumVariant`. * @param ctx the parse tree * @return the visitor result */ - visitNondetOperDef?: (ctx: NondetOperDefContext) => Result; + visitTypeSumVariant?: (ctx: TypeSumVariantContext) => Result; /** * Visit a parse tree produced by `QuintParser.qualifier`. @@ -644,6 +700,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitType?: (ctx: TypeContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.typeVar`. + * @param ctx the parse tree + * @return the visitor result + */ + visitTypeVar?: (ctx: TypeVarContext) => Result; + /** * Visit a parse tree produced by `QuintParser.row`. * @param ctx the parse tree @@ -728,6 +791,13 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitParameter?: (ctx: ParameterContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.annotatedParameter`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAnnotatedParameter?: (ctx: AnnotatedParameterContext) => Result; + /** * Visit a parse tree produced by `QuintParser.identOrStar`. * @param ctx the parse tree @@ -790,5 +860,12 @@ export interface QuintVisitor extends ParseTreeVisitor { * @return the visitor result */ visitSimpleId?: (ctx: SimpleIdContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.identifier`. + * @param ctx the parse tree + * @return the visitor result + */ + visitIdentifier?: (ctx: IdentifierContext) => Result; } diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index b8602e60e..2fa8080f4 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -8,8 +8,8 @@ * See LICENSE in the project root for license information. */ -import chalk from 'chalk' import { strict as assert } from 'assert' +import chalk from 'chalk' import { Doc, braces, @@ -108,8 +108,8 @@ export function prettyQuintEx(ex: QuintEx): Doc { const valueExpr = ex.args[1] const value = - valueExpr.kind === 'app' && valueExpr.opcode === 'Rec' && valueExpr.args.length === 0 - ? [] // A payload with the empty record is shown as a bare label + valueExpr.kind === 'app' && valueExpr.opcode === 'Tup' && valueExpr.args.length === 0 + ? [] // A payload with the empty tuple is shown as a bare label : [text('('), prettyQuintEx(valueExpr), text(')')] return group([label, ...value]) @@ -203,6 +203,10 @@ export function prettyQuintType(type: QuintType): Doc { case 'sum': { return prettySumRow(type.fields) } + case 'app': { + const args = type.args.map(prettyQuintType) + return group([prettyQuintType(type), text('['), ...args, text(']')]) + } } } diff --git a/quint/src/ir/IRTransformer.ts b/quint/src/ir/IRTransformer.ts index 2e733d0dd..68789e632 100644 --- a/quint/src/ir/IRTransformer.ts +++ b/quint/src/ir/IRTransformer.ts @@ -16,6 +16,8 @@ import * as ir from './quintIr' import * as t from './quintTypes' import { unreachable } from '../util' +import { LookupDefinition } from '../names/base' +import cloneDeep from 'lodash.clonedeep' export class IRTransformer { enterModule?: (module: ir.QuintModule) => ir.QuintModule @@ -86,6 +88,8 @@ export class IRTransformer { exitRecordType?: (type: t.QuintRecordType) => t.QuintRecordType enterSumType?: (type: t.QuintSumType) => t.QuintSumType exitSumType?: (type: t.QuintSumType) => t.QuintSumType + enterAppType?: (type: t.QuintAppType) => t.QuintAppType + exitAppType?: (type: t.QuintAppType) => t.QuintAppType /** Row types */ enterRow?: (row: t.Row) => t.Row @@ -108,7 +112,7 @@ export class IRTransformer { * @returns the tranformed Quint module */ export function transformModule(transformer: IRTransformer, quintModule: ir.QuintModule): ir.QuintModule { - let newModule = { ...quintModule } + let newModule = cloneDeep(quintModule) if (transformer.enterModule) { newModule = transformer.enterModule(newModule) @@ -133,7 +137,7 @@ export function transformModule(transformer: IRTransformer, quintModule: ir.Quin * @returns the transformed Quint type */ export function transformType(transformer: IRTransformer, type: t.QuintType): t.QuintType { - let newType = { ...type } + let newType = cloneDeep(type) if (transformer.enterType) { newType = transformer.enterType(newType) } @@ -254,6 +258,21 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. } } break + + case 'app': + { + if (transformer.enterAppType) { + newType = transformer.enterAppType(newType) + } + + newType.args = newType.args.map(v => transformType(transformer, v)) + + if (transformer.exitAppType) { + newType = transformer.exitAppType(newType) + } + } + break + default: unreachable(newType) } @@ -265,6 +284,30 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. return newType } +/** + * Transforms a Quint LookupDefinition with a transformer + * + * This is just a thin wrapper to deal with the fact that LookupDefinitions are a slightly awkward union. + * + * @param transformer: the IRTransformer instance with the functions to be invoked + * @param lud: the Quint LookupDefinition to be transformed + * + * @returns the transformed LookupDefinition + */ +export function transformLookupDefinition(transformer: IRTransformer, lud: LookupDefinition): LookupDefinition { + switch (lud.kind) { + case 'const': + case 'def': + case 'var': + case 'assume': + case 'typedef': + return transformDefinition(transformer, lud) + + case 'param': + return lud.typeAnnotation ? { ...lud, typeAnnotation: transformType(transformer, lud.typeAnnotation) } : lud + } +} + /** * Transforms a Quint declaration with a transformer, invoking the corresponding function for each * inner component. @@ -275,7 +318,7 @@ export function transformType(transformer: IRTransformer, type: t.QuintType): t. * @returns the transformed Quint definition */ export function transformDeclaration(transformer: IRTransformer, decl: ir.QuintDeclaration): ir.QuintDeclaration { - let newDecl = { ...decl } + let newDecl = cloneDeep(decl) if (transformer.enterDecl) { newDecl = transformer.enterDecl(newDecl) } @@ -333,7 +376,7 @@ export function transformDeclaration(transformer: IRTransformer, decl: ir.QuintD * @returns the transformed Quint definition */ export function transformDefinition(transformer: IRTransformer, def: ir.QuintDef): ir.QuintDef { - let newDef = { ...def } + let newDef = cloneDeep(def) if (transformer.enterDef) { newDef = transformer.enterDef(newDef) } @@ -408,7 +451,7 @@ export function transformDefinition(transformer: IRTransformer, def: ir.QuintDef * @returns the transformed Quint expression */ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.QuintEx { - let newExpr = { ...expr } + let newExpr = cloneDeep(expr) if (transformer.enterExpr) { newExpr = transformer.enterExpr(newExpr) } @@ -448,6 +491,9 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q newExpr = transformer.enterLambda(newExpr) } + newExpr.params = newExpr.params.map(p => + p.typeAnnotation ? { ...p, typeAnnotation: transformType(transformer, p.typeAnnotation) } : p + ) newExpr.expr = transformExpression(transformer, newExpr.expr) if (transformer.exitLambda) { @@ -497,7 +543,7 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q * @returns the transformed Quint row */ export function transformRow(transformer: IRTransformer, row: t.Row): t.Row { - let newRow = row + let newRow = cloneDeep(row) if (transformer.enterRow) { newRow = transformer.enterRow(newRow) } diff --git a/quint/src/ir/IRVisitor.ts b/quint/src/ir/IRVisitor.ts index 2cc9245a6..e0888ddcf 100644 --- a/quint/src/ir/IRVisitor.ts +++ b/quint/src/ir/IRVisitor.ts @@ -23,7 +23,10 @@ import { unreachable } from '../util' */ export interface IRVisitor { /* Keeps track of the depth of the current definition, to be updated by the - * walk* functions and used by implementations of the interface */ + * walk* functions and used by implementations of the interface. Should be + * initialized to -1, so if `walkDefinition` is called from a different place + * than `walkDeclaration` (which does set this to -1), the increments and + * decrements work as expected. */ definitionDepth?: number enterModule?: (_module: ir.QuintModule) => void @@ -90,6 +93,8 @@ export interface IRVisitor { exitRecordType?: (_type: t.QuintRecordType) => void enterSumType?: (_type: t.QuintSumType) => void exitSumType?: (_type: t.QuintSumType) => void + enterAppType?: (_type: t.QuintAppType) => void + exitAppType?: (_type: t.QuintAppType) => void /** Row types */ enterRow?: (_row: t.Row) => void @@ -242,6 +247,13 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { visitor.exitSumType?.(type) break + case 'app': + visitor.enterAppType?.(type) + walkType(visitor, type.ctor) + type.args.map(t => walkType(visitor, t)) + visitor.exitAppType?.(type) + break + default: unreachable(type) } @@ -432,17 +444,30 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { break } case 'lambda': + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth++ + } if (visitor.enterLambda) { visitor.enterLambda(expr) } - + expr.params.forEach(p => { + if (p.typeAnnotation) { + walkType(visitor, p.typeAnnotation) + } + }) walkExpression(visitor, expr.expr) if (visitor.exitLambda) { visitor.exitLambda(expr) } + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth-- + } break case 'let': + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth++ + } if (visitor.enterLet) { visitor.enterLet(expr) } @@ -453,6 +478,9 @@ export function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { if (visitor.exitLet) { visitor.exitLet(expr) } + if (visitor.definitionDepth !== undefined) { + visitor.definitionDepth-- + } break default: unreachable(expr) diff --git a/quint/src/ir/IRprinting.ts b/quint/src/ir/IRprinting.ts index f90012752..8bbc720c1 100644 --- a/quint/src/ir/IRprinting.ts +++ b/quint/src/ir/IRprinting.ts @@ -121,7 +121,8 @@ export function definitionToString(def: QuintDef, includeBody: boolean = true, t return `assume ${def.name} = ${expressionToString(def.assumption)}` case 'typedef': if (def.type) { - return `type ${def.name} = ${typeToString(def.type)}` + const params = def.params && def.params.length > 0 ? `[${def.params.join(', ')}]` : '' + return `type ${def.name}${params} = ${typeToString(def.type)}` } else { return `type ${def.name}` } @@ -187,6 +188,11 @@ export function typeToString(type: QuintType): string { case 'sum': { return sumToString(type) } + case 'app': { + const abs = typeToString(type.ctor) + const args = type.args.map(typeToString).join(', ') + return `${abs}[${args}]` + } } } @@ -214,16 +220,20 @@ export function sumToString(s: QuintSumType): string { } function sumFieldsToString(r: ConcreteRow): string { - return r.fields - .map((f: RowField) => { - if (isUnitType(f.fieldType)) { - return `${f.fieldName}` - } else { - return `${f.fieldName}(${typeToString(f.fieldType)})` - } - }) - .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) - .join(' | ') + return ( + r.fields + .map((f: RowField) => { + if (isUnitType(f.fieldType)) { + return `${f.fieldName}` + } else { + return `${f.fieldName}(${typeToString(f.fieldType)})` + } + }) + // We are not exposing open rows in sum types currently + // So we do not show show row variables. + .concat(r.other.kind === 'row' ? [sumFieldsToString(r.other)] : []) + .join(' | ') + ) } /** diff --git a/quint/src/ir/quintIr.ts b/quint/src/ir/quintIr.ts index 937804de2..d4c42e656 100644 --- a/quint/src/ir/quintIr.ts +++ b/quint/src/ir/quintIr.ts @@ -136,6 +136,7 @@ export const builtinOpCodes = [ 'and', 'append', 'assert', + 'expect', 'assign', 'chooseSome', 'concat', @@ -192,6 +193,7 @@ export const builtinOpCodes = [ 'put', 'q::test', 'q::testOnce', + 'q::debug', 'range', 'replaceAt', 'reps', @@ -216,7 +218,7 @@ export const builtinOpCodes = [ export type QuintBuiltinOpcode = (typeof builtinOpCodes)[number] -export interface QuintLambdaParameter extends WithId { +export interface QuintLambdaParameter extends WithId, WithOptionalTypeAnnotation { /** The name of the formal parameter */ name: string } @@ -287,16 +289,20 @@ export interface QuintAssume extends WithId { assumption: QuintEx } -/** QuintTypeDefs represent both type aliases and abstract types +/** QuintTypeDefs represent declared type constructors and abstract types * * - Abstract types do not have an associated `type` - * - Type aliases always have an associated `type` + * - Type constructors aliases have an associated `type` and `n >= 0` type parameters */ export interface QuintTypeDef extends WithId { /** definition kind ('typedef') */ kind: 'typedef' /** name of a type alias */ name: string + /** type variables + * + * `typeof params === 'undefined'` is taken to mean the same as `params.length === 0` */ + params?: string[] /** type to associate with the alias (none for uninterpreted type) */ type?: QuintType } diff --git a/quint/src/ir/quintTypes.ts b/quint/src/ir/quintTypes.ts index a572d52a7..624bb2e31 100644 --- a/quint/src/ir/quintTypes.ts +++ b/quint/src/ir/quintTypes.ts @@ -69,22 +69,22 @@ export interface QuintTupleType extends WithOptionalId { fields: Row } -export interface QuintRecordType extends WithOptionalId { - kind: 'rec' - fields: Row -} - // A value of the unit type, i.e. an empty record -export function unitType(id: bigint): QuintRecordType { +export function unitType(id: bigint): QuintTupleType { return { id, - kind: 'rec', + kind: 'tup', fields: { kind: 'row', fields: [], other: { kind: 'empty' } }, } } export function isUnitType(r: QuintType): Boolean { - return r.kind === 'rec' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' + return r.kind === 'tup' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' +} + +export interface QuintRecordType extends WithOptionalId { + kind: 'rec' + fields: Row } export interface QuintSumType extends WithOptionalId { @@ -98,6 +98,23 @@ export function sumType(labelTypePairs: [string, QuintType][], rowVar?: string, return { kind: 'sum', fields: { kind: 'row', fields, other }, id } } +/** + * Type application + * + * E.g., + * + * ``` + * T[int, str] + * ``` + * + * for a type constant `T`. + */ +export interface QuintAppType extends WithOptionalId { + kind: 'app' + ctor: QuintConstType /** The type constructor applied */ + args: QuintType[] /** The arguments to which the constructor is applied */ +} + /** * A type in Type System 1.2. */ @@ -114,6 +131,7 @@ export type QuintType = | QuintTupleType | QuintRecordType | QuintSumType + | QuintAppType /** * Row types, used to express tuples and records. diff --git a/quint/src/itf.ts b/quint/src/itf.ts index 7cd3199a5..6daaa81f8 100644 --- a/quint/src/itf.ts +++ b/quint/src/itf.ts @@ -42,6 +42,7 @@ export type ItfValue = | ItfMap | ItfUnserializable | ItfRecord + | ItfVariant type ItfBigint = { '#bigint': string } type ItfTup = { '#tup': ItfValue[] } @@ -49,6 +50,7 @@ type ItfSet = { '#set': ItfValue[] } type ItfMap = { '#map': [ItfValue, ItfValue][] } type ItfUnserializable = { '#unserializable': string } type ItfRecord = { [index: string]: ItfValue } +type ItfVariant = { tag: ItfValue; value: ItfValue } // Type predicates to help with type narrowing function isBigint(v: ItfValue): v is ItfBigint { @@ -67,6 +69,10 @@ function isMap(v: ItfValue): v is ItfMap { return (v as ItfMap)['#map'] !== undefined } +function isVariant(v: ItfValue): v is ItfVariant { + return (v as ItfVariant)['tag'] !== undefined +} + function isUnserializable(v: ItfValue): v is ItfUnserializable { return (v as ItfUnserializable)['#unserializable'] !== undefined } @@ -140,6 +146,9 @@ export function toItf(vars: string[], states: QuintEx[]): Either ({ tag: label, value: value })) + default: return left(`Unexpected operator type: ${ex.opcode}`) } @@ -180,6 +189,12 @@ export function ofItf(itf: ItfTrace): QuintEx[] { if (typeof value === 'boolean') { return { id, kind: 'bool', value } } else if (typeof value === 'string') { + if (value === 'U_OF_UNIT') { + // Apalache converts empty tuples to its unit value, "U_OF_UNIT". + // We need to convert it back to Quint's unit value, the empty tuple. + return { id, kind: 'app', opcode: 'Tup', args: [] } + } + return { id, kind: 'str', value } } else if (isBigint(value)) { // this is the standard way of encoding an integer in ITF. @@ -209,6 +224,10 @@ export function ofItf(itf: ItfTrace): QuintEx[] { opcode: 'Map', args, } + } else if (isVariant(value)) { + const l = ofItfValue(value.tag) + const v = ofItfValue(value.value) + return { id, kind: 'app', opcode: 'variant', args: [l, v] } } else if (typeof value === 'object') { // Any other object must represent a record // For each key/value pair in the object, form the quint expressions representing diff --git a/quint/src/names/base.ts b/quint/src/names/base.ts index 7d3c75f01..bd1f3d9c0 100644 --- a/quint/src/names/base.ts +++ b/quint/src/names/base.ts @@ -12,6 +12,7 @@ * @module */ +import { cloneDeep, compact } from 'lodash' import { QuintDef, QuintExport, QuintImport, QuintInstance, QuintLambdaParameter } from '../ir/quintIr' import { QuintType } from '../ir/quintTypes' import { QuintError } from '../quintError' @@ -42,14 +43,16 @@ export type LookupDefinition = (QuintDef | ({ kind: 'param' } & QuintLambdaParam * Some types in `QuintDef` already have a `typeAnnotation` field. This * ensures that this field is always accessible */ typeAnnotation?: QuintType - /** optional depth of the definition, 0 if top-level. Only for `QuintOpDef`. */ + /* optional depth of the definition, 0 if top-level. Only for `QuintOpDef`. */ depth?: number + /* optional flag to tell if this is shadowing another def, therefore needing to be unshadowed during compilation */ + shadowing?: boolean } /** * A module's definitions, indexed by name. */ -export type DefinitionsByName = Map +export type DefinitionsByName = Map /** * Definitions for each module @@ -83,6 +86,10 @@ export type NameResolutionResult = { errors: QuintError[] } +export function getTopLevelDef(defs: DefinitionsByName, name: string): LookupDefinition | undefined { + return defs.get(name)?.at(0) +} + /** * Copy the names of a definitions table to a new one, ignoring hidden * definitions, and optionally adding a namespace. @@ -100,11 +107,15 @@ export function copyNames( ): DefinitionsByName { const table = new Map() - originTable.forEach((def, identifier) => { + originTable.forEach((defs, identifier) => { const name = namespace ? [namespace, identifier].join('::') : identifier - if (!def.hidden || def.kind === 'const') { - table.set(name, copyAsHidden ? { ...def, hidden: copyAsHidden } : def) - } + const newDefs = defs.map(def => { + if (!def.hidden || def.kind === 'const') { + return cloneDeep(copyAsHidden ? { ...def, hidden: copyAsHidden } : def) + } + }) + + table.set(name, compact(newDefs)) }) return table @@ -193,6 +204,7 @@ export const builtinNames = [ 'eventually', 'next', 'then', + 'expect', 'reps', 'fail', 'assert', @@ -235,4 +247,6 @@ export const builtinNames = [ 'difference', 'matchVariant', 'variant', + 'q::debug', + 'q::lastTrace', ] diff --git a/quint/src/names/collector.ts b/quint/src/names/collector.ts index bb1708f72..393353459 100644 --- a/quint/src/names/collector.ts +++ b/quint/src/names/collector.ts @@ -34,6 +34,7 @@ import { addNamespacesToDef, builtinNames, copyNames, + getTopLevelDef, } from './base' import { moduleNotFoundError, @@ -42,7 +43,7 @@ import { paramNotFoundError, selfReferenceError, } from './importErrors' -import { compact } from 'lodash' +import { cloneDeep, compact } from 'lodash' /** * Collects all top-level definitions in Quint modules. Used internally by @@ -54,6 +55,10 @@ export class NameCollector implements IRVisitor { definitionsByModule: DefinitionsByModule = new Map() errors: QuintError[] = [] table: LookupTable = new Map() + + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 private currentModuleName: string = '' @@ -114,7 +119,7 @@ export class NameCollector implements IRVisitor { return } - const instanceTable = new Map([...moduleTable.entries()]) + const instanceTable = cloneDeep(moduleTable) if (decl.qualifiedName) { // Add the qualifier to `definitionsMyModule` map with a copy of the // definitions, so if there is an export of that qualifier, we know which @@ -125,7 +130,8 @@ export class NameCollector implements IRVisitor { // For each override, check if the name exists in the instantiated module and is a constant. // If so, update the value definition to point to the expression being overriden decl.overrides.forEach(([param, ex]) => { - const constDef = instanceTable.get(param.name) + // Constants are always top-level + const constDef = getTopLevelDef(instanceTable, param.name) if (!constDef) { this.errors.push(paramNotFoundError(decl, param)) @@ -138,13 +144,14 @@ export class NameCollector implements IRVisitor { } // Update the definition to point to the expression being overriden - instanceTable.set(param.name, { ...constDef, id: ex.id }) + constDef.id = ex.id + constDef.hidden = false }) // All names from the instanced module should be acessible with the instance namespace // So, copy them to the current module's lookup table const newDefs = copyNames(instanceTable, decl.qualifiedName, true) - this.collectDefinitions(newDefs, decl) + this.collectTopLevelDefinitions(newDefs, decl) } enterImport(decl: QuintImport): void { @@ -154,7 +161,7 @@ export class NameCollector implements IRVisitor { return } - const moduleTable = this.definitionsByModule.get(decl.protoName) + const moduleTable = cloneDeep(this.definitionsByModule.get(decl.protoName)) if (!moduleTable) { // Importing non-existing module @@ -174,12 +181,12 @@ export class NameCollector implements IRVisitor { if (!decl.defName || decl.defName === '*') { // Imports all definitions - this.collectDefinitions(importableDefinitions, decl) + this.collectTopLevelDefinitions(importableDefinitions, decl) return } // Tries to find a specific definition, reporting an error if not found - const newDef = importableDefinitions.get(decl.defName) + const newDef = getTopLevelDef(importableDefinitions, decl.defName) if (!newDef) { this.errors.push(nameNotFoundError(decl)) return @@ -199,7 +206,7 @@ export class NameCollector implements IRVisitor { return } - const moduleTable = this.definitionsByModule.get(decl.protoName) + const moduleTable = cloneDeep(this.definitionsByModule.get(decl.protoName)) if (!moduleTable) { // Exporting non-existing module this.errors.push(moduleNotFoundError(decl)) @@ -210,12 +217,12 @@ export class NameCollector implements IRVisitor { if (!decl.defName || decl.defName === '*') { // Export all definitions - this.collectDefinitions(exportableDefinitions, decl) + this.collectTopLevelDefinitions(exportableDefinitions, decl) return } // Tries to find a specific definition, reporting an error if not found - const newDef = exportableDefinitions.get(decl.defName) + const newDef = getTopLevelDef(exportableDefinitions, decl.defName) if (!newDef) { this.errors.push(nameNotFoundError(decl)) @@ -238,29 +245,51 @@ export class NameCollector implements IRVisitor { * than `def.name` (i.e. in import-like statements). * @param source - An optional source identifier for the definition, if the * source is different than `def.id` (i.e. in import-like statements). + * + * @returns The definition object that was collected. */ - collectDefinition(def: LookupDefinition, importedFrom?: QuintImport | QuintExport | QuintInstance): void { + collectDefinition(def: LookupDefinition, importedFrom?: QuintImport | QuintExport | QuintInstance): LookupDefinition { const identifier = (importedFrom as QuintImport)?.defName ?? def.name const source = importedFrom?.id ?? def.id if (identifier === '_') { // Don't collect underscores, as they are special identifiers that allow no usage - return + return def } if (builtinNames.includes(identifier)) { // Conflict with a built-in name this.recordConflict(identifier, undefined, source) - return + return def } - if (this.definitionsByName.has(identifier) && this.definitionsByName.get(identifier)!.id != def.id) { - // Conflict with a previous definition - this.recordConflict(identifier, this.definitionsByName.get(identifier)!.id, source) - return + def.depth ??= 0 + const namespaces = importedFrom ? this.namespaces(importedFrom) : [] + + if (!this.definitionsByName.has(identifier)) { + // No existing defs with this name. Create an entry with a single def. + this.definitionsByName.set(identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]) + return def } - const namespaces = importedFrom ? this.namespaces(importedFrom) : [] - this.definitionsByName.set(identifier, { ...addNamespacesToDef(def, namespaces), importedFrom }) + // Else: There are exiting defs. We need to check for conflicts + const existingEntries = this.definitionsByName.get(identifier)! + // Entries conflict if they have different ids, but the same depth. + // Entries with different depths are ok, because one is shadowing the + // other. + const conflictingEntries = existingEntries.filter(entry => entry.id !== def.id && entry.depth === def.depth) + + // Record potential errors and move on + conflictingEntries.forEach(existingEntry => { + this.recordConflict(identifier, existingEntry.id, source) + }) + + // Keep entries with different ids. DON'T keep the whole + // `existingEntries` since those may contain the same exact defs, but + // hidden. + const newDef = { ...addNamespacesToDef(def, namespaces), importedFrom, shadowing: existingEntries.length > 0 } + this.definitionsByName.set(identifier, existingEntries.filter(entry => entry.id !== def.id).concat([newDef])) + + return newDef } /** @@ -269,11 +298,12 @@ export class NameCollector implements IRVisitor { * @param identifier - The identifier of the definition to delete. */ deleteDefinition(identifier: string): void { - this.definitionsByName.delete(identifier) + this.definitionsByName.get(identifier)?.pop() + return } /** - * Obtains a collected definition. + * Gets the definition with the given name, in the current (visiting) scope * * @param identifier - The identifier of the definition to retrieve. * @@ -281,7 +311,12 @@ export class NameCollector implements IRVisitor { * definitions with that identifier was never collected. */ getDefinition(identifier: string): LookupDefinition | undefined { - return this.definitionsByName.get(identifier) + const defs = this.definitionsByName.get(identifier) + if (defs === undefined || defs.length === 0) { + return + } + + return defs[defs.length - 1] } private namespaces(decl: QuintImport | QuintInstance | QuintExport): string[] { @@ -293,18 +328,33 @@ export class NameCollector implements IRVisitor { return namespace ? [namespace] : [] } - private collectDefinitions( + private collectTopLevelDefinitions( newDefs: DefinitionsByName, importedFrom?: QuintImport | QuintExport | QuintInstance ): void { const namespaces = importedFrom ? this.namespaces(importedFrom) : [] - const newEntries: [string, LookupDefinition][] = [...newDefs.entries()].map(([identifier, def]) => { - const existingEntry = this.definitionsByName.get(identifier) - if (existingEntry && existingEntry.id !== def.id) { - this.recordConflict(identifier, existingEntry.id, def.id) - } - return [identifier, { ...addNamespacesToDef(def, namespaces), importedFrom }] - }) + const newEntries: [string, LookupDefinition[]][] = compact( + [...newDefs.keys()].map(identifier => { + const def = getTopLevelDef(newDefs, identifier) + if (!def) { + return + } + + const existingEntries = this.definitionsByName.get(identifier) + if (existingEntries) { + const conflictingEntries = existingEntries.filter(entry => entry.id !== def.id) + conflictingEntries.forEach(existingEntry => { + this.recordConflict(identifier, existingEntry.id, def.id) + }) + + // Keep conflicting entries and add the new one. DON'T keep the whole + // `existingEntries` since those may contain the same exact defs, but + // hidden. + return [identifier, conflictingEntries.concat([{ ...addNamespacesToDef(def, namespaces), importedFrom }])] + } + return [identifier, [{ ...addNamespacesToDef(def, namespaces), importedFrom }]] + }) + ) this.definitionsByName = new Map([...this.definitionsByName.entries(), ...newEntries]) } diff --git a/quint/src/names/resolver.ts b/quint/src/names/resolver.ts index 3d0bf3397..e9adb4c42 100644 --- a/quint/src/names/resolver.ts +++ b/quint/src/names/resolver.ts @@ -43,6 +43,10 @@ class NameResolver implements IRVisitor { collector: NameCollector errors: QuintError[] = [] table: LookupTable = new Map() + + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 constructor() { @@ -54,8 +58,8 @@ class NameResolver implements IRVisitor { unusedDefinitions: UnusedDefinitions = moduleName => { const definitions: LookupDefinition[] = Array.from( this.collector.definitionsByModule.get(moduleName)?.values() || [] - ) - const usedDefinitions = [...this.table.values()] + ).flat() + const usedDefinitions = [...this.table.values()].flat() return new Set(difference(definitions, usedDefinitions)) } @@ -71,7 +75,11 @@ class NameResolver implements IRVisitor { // Top-level definitions were already collected, so we only need to collect // scoped definitions. if (this.definitionDepth > 0) { - this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) + const newDef = this.collector.collectDefinition({ ...def, depth: this.definitionDepth }) + this.table.set(def.id, { ...newDef, depth: this.definitionDepth }) + } else { + // Map the definition to itself so we can recover depth information from the table + this.table.set(def.id, { ...def, depth: this.definitionDepth }) } } @@ -84,7 +92,7 @@ class NameResolver implements IRVisitor { enterLambda(expr: QuintLambda): void { // Lambda parameters are scoped, so they are collected here expr.params.forEach(p => { - this.collector.collectDefinition({ ...p, kind: 'param' }) + this.collector.collectDefinition({ ...p, kind: 'param', depth: this.definitionDepth }) }) } diff --git a/quint/src/names/unshadower.ts b/quint/src/names/unshadower.ts index 45f8ecf0d..ad54e4cc7 100644 --- a/quint/src/names/unshadower.ts +++ b/quint/src/names/unshadower.ts @@ -19,7 +19,7 @@ import { QuintApp, QuintLambda, QuintLambdaParameter, QuintLet, QuintModule, Qui /** * Replace all names with unique names, to avoid shadowing. * - Lambda parameters are renamed to `_` - * - Nested definitions (from let expressions) are renamed to `_` + * - Nested definitions (from let expressions) are renamed to `_` only if they shadow another name * * @param module The module to unshadow * @param lookupTable The lookup table with the module's name references @@ -41,6 +41,9 @@ class Unshadower implements IRTransformer { enterLambda(lambda: QuintLambda): QuintLambda { const newParams: QuintLambdaParameter[] = lambda.params.map(p => { + // Ideally, we should only rename if `this.lookupTable.get(p.id)?.shadowing` is true, as we do in let. + // However, this currently is a problem with Apalache, see issue #1443. + const newName = `${p.name}_${lambda.id}` this.nestedNames.set(p.id, newName) @@ -50,6 +53,11 @@ class Unshadower implements IRTransformer { } enterLet(expr: QuintLet): QuintLet { + if (!this.lookupTable.get(expr.opdef.id)?.shadowing) { + // nothing to do + return expr + } + const newName = `${expr.opdef.name}_${expr.id}` this.nestedNames.set(expr.opdef.id, newName) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index f758bd424..7bf370f2a 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -16,15 +16,19 @@ import { QuintName, QuintOpDef, QuintStr, + isAnnotatedDef, } from '../ir/quintIr' import { ConcreteFixedRow, + QuintAppType, QuintConstType, QuintSumType, QuintType, + QuintVarType, Row, RowField, isUnitType, + typeNames, unitType, } from '../ir/quintTypes' import { SourceMap } from './quintParserFrontend' @@ -34,8 +38,9 @@ import { TerminalNode } from 'antlr4ts/tree/TerminalNode' import { QuintTypeDef } from '../ir/quintIr' import { zip } from '../util' import { QuintError } from '../quintError' -import { lowercaseTypeError, tooManySpreadsError } from './parseErrors' +import { lowercaseTypeError, tooManySpreadsError, undeclaredTypeParamsError } from './parseErrors' import { Loc } from '../ErrorMessage' +import assert, { fail } from 'assert' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -81,8 +86,6 @@ export class ToIrListener implements QuintListener { protected exprStack: QuintEx[] = [] // the stack of parameter lists protected paramStack: QuintLambdaParameter[] = [] - // stack of names used as parameters and assumptions - protected identOrHoleStack: string[] = [] // the stack for imported names protected identOrStarStack: string[] = [] // the stack of rows for records @@ -166,140 +169,80 @@ export class ToIrListener implements QuintListener { this.exprStack.push(letExpr) } - exitNondetOperDef(ctx: p.NondetOperDefContext) { - const name = ctx.qualId().text - let typeAnnotation: QuintType | undefined - if (ctx.type()) { - const maybeType = this.popType() - if (maybeType.isJust()) { - // the operator is tagged with a type - typeAnnotation = maybeType.value - } - } - const expr = this.exprStack.pop() ?? this.undefinedExpr(ctx)() - - const id = this.getId(ctx) - - const def: QuintDef = { - id, - kind: 'def', - name, - qualifier: 'nondet', - expr, - typeAnnotation, - } - - this.declarationStack.push(def) - } + /** **************** translate operator definititons **********************/ - // special case for: nondet x = e1; e2 - exitNondet(ctx: p.NondetContext) { - const def = this.declarationStack.pop() ?? this.undefinedDeclaration(ctx)() - const nested = this.exprStack.pop() ?? this.undefinedExpr(ctx)() + // translate a top-level or nested operator definition + exitAnnotatedOperDef(ctx: p.AnnotatedOperDefContext) { + const name = ctx.normalCallName().text - if (def.kind !== 'def') { - // only `QuintDef` is allowed in `nondet` expressions - console.debug(`[DEBUG] non-def found in nondet definition: ${ctx.text}`) - return - } + const params = ctx._annotOperParam.map(_ => popOrFail(this.paramStack, 'annotated AnnotatedOperDef')).reverse() + const res = this.popType().unwrap(() => 'violated grammar of annotated params return type') + const args = params.map(p => { + assert(isAnnotatedDef(p), 'violated grammar of annotated param type') + return p.typeAnnotation + }) + const typeAnnotation: QuintType = { kind: 'oper', args, res } - const id = this.getId(ctx) - const letExpr: QuintEx = { - id, - kind: 'let', - opdef: def, - expr: nested, - } - this.exprStack.push(letExpr) + this.putDeclarationOnStack(ctx, name, params, just(typeAnnotation)) } - /** **************** translate operator definititons **********************/ - - // translate a top-level or nested operator definition - exitOperDef(ctx: p.OperDefContext) { + // TODO Mark as deprecated, then remove + // See https://github.com/informalsystems/quint/issues/923 + exitDeprecatedOperDef(ctx: p.DeprecatedOperDefContext) { const name = ctx.normalCallName().text - const [params, typeTag] = this.processOpDefParams(ctx) - // get the definition body + + // The deprecated annotation grammar + const typeAnnotation: Maybe = ctx._annotatedRetType ? this.popType() : none() + const params = ctx._operParam + .map(_ => popOrFail(this.paramStack, 'violated grammar of non-annotated params')) + .reverse() + // TODO Enable after builtins are fixed + // if (params.length > 0 && typeAnnotation.isJust()) { + // console.warn( + // 'post-operator-head annotations are deprecated; see https://github.com/informalsystems/quint/issues/923' + // ) + // } + this.putDeclarationOnStack(ctx, name, params, typeAnnotation) + } + + private putDeclarationOnStack( + ctx: p.DeprecatedOperDefContext | p.AnnotatedOperDefContext, + name: string, + params: QuintLambdaParameter[], + typeAnnotation: Maybe + ) { const expr: QuintEx = ctx.expr() ? this.exprStack.pop() ?? this.undefinedExpr(ctx)() : // This is only a definition header, use a default body since the IR // does not have a representation for this at the moment { id: this.getId(ctx), kind: 'bool', value: true } - // extract the qualifier - let qualifier: OpQualifier = 'def' - if (ctx.qualifier()) { - const qtext = ctx.qualifier().text - // case distinction to make the type checker happy - if ( - qtext === 'pureval' || - qtext === 'puredef' || - qtext === 'val' || - qtext === 'def' || - qtext === 'action' || - qtext === 'run' || - qtext === 'temporal' - ) { - qualifier = qtext - } - } + // The grammar should guarantee we only parse valid OpQualifiers here + const qualifier: OpQualifier = ctx.qualifier().text as OpQualifier - let body = expr - const id = this.getId(ctx) + const body: QuintEx = + params.length === 0 + ? expr + : // If the definition has parameters, introduce a lambda + { id: this.getId(ctx), kind: 'lambda', params, qualifier, expr } - if (params.length > 0) { - // if the definition has parameters, introduce a lambda - body = { - id, - kind: 'lambda', - params, - qualifier, - expr, - } - } const def: QuintOpDef = { - id, + id: this.getId(ctx), kind: 'def', name, qualifier, expr: body, } - if (typeTag.isJust()) { - def.typeAnnotation = typeTag.value + if (typeAnnotation.isJust()) { + def.typeAnnotation = typeAnnotation.value } this.declarationStack.push(def) } - // The definition parameters may be of two kinds: C-like and ML-like. - // Handle them here. - processOpDefParams(ctx: p.OperDefContext): [QuintLambdaParameter[], Maybe] { - const params = popMany(this.paramStack, ctx.parameter().length, this.undefinedParam(ctx)) - // types of the parameters and of the result - const ntypes = ctx.type().length - if (ntypes === 0) { - return [params, none()] - } else if (ntypes > 1) { - // a C-like signature, combine it into an operator type - const types = popMany(this.typeStack, ntypes, this.undefinedType(ctx)) - const id = this.getId(ctx) - const fullType: Maybe = just({ - id, - kind: 'oper', - args: types.slice(0, -1), - res: types[types.length - 1], - }) - return [params, fullType] - } else { - // the only type is on the stack - const fullType = this.popType() - return [params, fullType] - } - } - // assume name = expr - exitAssume(ctx: any) { + exitAssume(ctx: p.AssumeContext) { const expr = this.exprStack.pop()! - const name = this.identOrHoleStack.pop()! + const name = ctx._assumeName.text const id = this.getId(ctx) const assume: QuintDef = { id, @@ -364,41 +307,67 @@ export class ToIrListener implements QuintListener { this.declarationStack.push(def) } - // type Alias = set(int) + // E.g., + // + // - type Alias = Set[int] + // - type Constr[a, b] = (Set[a], Set[b]) exitTypeAliasDef(ctx: p.TypeAliasDefContext) { - const name = ctx.qualId()!.text - const type = this.popType().value const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + const type = this.popType().unwrap(() => + fail('internal error: type alias declaration parsed with no right hand side') + ) if (name[0].match('[a-z]')) { this.errors.push(lowercaseTypeError(id, name)) } - const def: QuintTypeDef = { - id, - kind: 'typedef', - name, - type, - } + let defWithoutParams: QuintTypeDef = { id: id, kind: 'typedef', name, type } + const def: QuintTypeDef = + defHead._typeVars.length > 0 + ? { ...defWithoutParams, params: defHead._typeVars.map(t => t.text!) } + : defWithoutParams + + this.checkForUndeclaredTypeVariables(id, def) this.declarationStack.push(def) } - // type T = | A | B(t1) | C(t2) + // E.g., + // + // - type T = | A | B(t1) | C(t2) + // - type Result[ok, err] = | Ok(ok) | Err(err) exitTypeSumDef(ctx: p.TypeSumDefContext) { - const name = ctx._typeName!.text! const id = this.getId(ctx) + const defHead = ctx.typeDefHead() + const name = defHead._typeName.text + // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length, this.undefinedVariant(ctx)) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } const type: QuintSumType = { id, kind: 'sum', fields: row } - const typeName: QuintConstType = { id, kind: 'const', name } - const def: QuintTypeDef = { - id: id, - name, - kind: 'typedef', - type, + + let defWithoutParams: QuintTypeDef = { id: id, kind: 'typedef', name, type } + const def: QuintTypeDef = + defHead._typeVars.length > 0 + ? { ...defWithoutParams, params: defHead._typeVars.map(t => t.text!) } + : defWithoutParams + + this.checkForUndeclaredTypeVariables(id, def) + + // Used for annotations in the variant constructors + let constructorReturnType: QuintType + // The constant identifying the type definition. E.g. `Result` + const typeConst: QuintConstType = { id: this.getId(ctx), kind: 'const', name } + if (def.params) { + // The type takes parameters, so we need a type application as the return type. E.g., `Result[ok, err]` + const args: QuintVarType[] = def.params.map(name => ({ id: this.getId(ctx), kind: 'var', name })) + constructorReturnType = { id, kind: 'app', ctor: typeConst, args } + } else { + // The type takes no parameters, so we only need the constant name + constructorReturnType = typeConst } // Generate all the variant constructors implied by a variant type definition @@ -414,8 +383,8 @@ export class ToIrListener implements QuintListener { // We will generate // // ``` - // def A(__AParam) = variant("A", __AParam) - // val B = {} + // def A(__AParam: int) : T = variant("A", __AParam) + // val B : T = {} // ``` // // Allowing users to write: @@ -424,7 +393,7 @@ export class ToIrListener implements QuintListener { // val a: T = A(42) // val b: T = B // ``` - const constructors: QuintOpDef[] = zip(fields, ctx.typeSumVariant()).map( + const constructors: QuintOpDef[] = zip(fields, ctx.sumTypeDefinition().typeSumVariant()).map( ([{ fieldName, fieldType }, variantCtx]) => { // Mangle the parameter name to avoid clashes // This shouldn't be visible to users @@ -445,11 +414,11 @@ export class ToIrListener implements QuintListener { // ``` qualifier = 'val' - // The nullary variant constructor is actualy + // The nullary variant constructor is actually // a variant pairing a label with the unit. const wrappedExpr = unitValue(this.getId(variantCtx._sumLabel)) - typeAnnotation = typeName + typeAnnotation = constructorReturnType expr = { id: this.getId(variantCtx), kind: 'app', @@ -475,7 +444,7 @@ export class ToIrListener implements QuintListener { args: [label, wrappedExpr], } - typeAnnotation = { kind: 'oper', args: [fieldType], res: typeName } + typeAnnotation = { kind: 'oper', args: [fieldType], res: constructorReturnType } expr = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } } @@ -497,6 +466,22 @@ export class ToIrListener implements QuintListener { this.variantStack.push({ fieldName, fieldType }) } + private checkForUndeclaredTypeVariables(id: bigint, typeDef: QuintTypeDef) { + if (!typeDef.type) { + return + } + + const typeVars = typeNames(typeDef.type) + const undeclaredTypeVariables: string[] = + // We are just checking if the type variables appearing in `type` are a subset of the type params + // but our version of node has no sensible set operations? + [...typeVars.typeVariables, ...typeVars.rowVariables].filter(v => !(typeDef.params ?? []).includes(v)) + + if (undeclaredTypeVariables.length > 0) { + this.errors.push(undeclaredTypeParamsError(id, undeclaredTypeVariables)) + } + } + // module Foo = Proto(x = a, y = b) // module Foo = Proto(x = a, y = b) from "" exitInstanceMod(ctx: p.InstanceModContext) { @@ -698,24 +683,22 @@ export class ToIrListener implements QuintListener { this.exprStack.push(untupledLambda) } - // a single parameter in a lambda expression: an identifier or '_' - exitIdentOrHole(ctx: p.IdentOrHoleContext) { - if (ctx.text === '_') { - // a hole '_' - this.identOrHoleStack.push('_') - } else { - // a variable name - this.identOrHoleStack.push(ctx.qualId()!.text) - } - } - exitParameter(ctx: p.ParameterContext) { - const name = popMany(this.identOrHoleStack, 1, () => '_')[0] - + const name = ctx._paramName.text const id = this.getId(ctx) this.paramStack.push({ id, name }) } + // TODO Consolidate with `exitParameter`, see https://github.com/informalsystems/quint/issues/923 + exitAnnotatedParameter(ctx: p.AnnotatedParameterContext) { + const name = ctx._paramName.text + const id = this.getId(ctx) + const typeAnnotation = this.popType().unwrap(() => + fail('internal error: the grammar guarantees a type should be on the stack') + ) + this.paramStack.push({ id, name, typeAnnotation }) + } + // an identifier or star '*' in import exitIdentOrStar(ctx: p.IdentOrStarContext) { if (ctx.text === '*') { @@ -734,6 +717,11 @@ export class ToIrListener implements QuintListener { this.pushApplication(ctx, 'Tup', args) } + // The unit, (), represented by the empty tuple + exitUnit(ctx: p.UnitContext) { + this.exprStack.push(unitValue(this.getId(ctx))) + } + // pair constructor, e.g., 2 -> 3 exitPair(ctx: p.PairContext) { const args = popMany(this.exprStack, ctx.expr().length, this.undefinedExpr(ctx)) @@ -1035,19 +1023,36 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'str' }) } + exitTypeVar(ctx: p.TypeVarContext) { + const name = ctx.LOW_ID().text + const id = this.getId(ctx) + this.typeStack.push({ id, kind: 'var', name }) + } + // a type variable, a type constant, or a reference to a type alias - exitTypeConstOrVar(ctx: p.TypeConstOrVarContext) { + exitTypeConst(ctx: p.TypeConstContext) { const name = ctx.qualId().text const id = this.getId(ctx) - if (name[0].match('[a-z]')) { - // a type variable from: a, b, ... z - this.typeStack.push({ id, kind: 'var', name }) - } else { - // a type constant, e.g., declared via typedef - this.typeStack.push({ id, kind: 'const', name }) - } + this.typeStack.push({ id, kind: 'const', name }) } + // E.g., Result[int, str] + exitTypeApp(ctx: p.TypeAppContext) { + const id = this.getId(ctx) + const args: QuintType[] = ctx._typeArg + .map(_ => + // We require that there is one parsed type for each typeArg recorded + this.popType().unwrap() + ) // The stack stores the arguments in reverse order + .reverse() + // The next type on the stack after the args should be the applied + // type constructor + const ctor: QuintConstType = { id: this.getId(ctx), kind: 'const', name: ctx._typeCtor.text } + const typeApp: QuintAppType = { id, kind: 'app', ctor, args } + this.typeStack.push(typeApp) + } + + // TODO: replace with general type application // a set type, e.g., set(int) exitTypeSet(ctx: p.TypeSetContext) { const last = this.popType().unwrap() @@ -1055,6 +1060,7 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'set', elem: last }) } + // TODO: replace with general type application // a list type, e.g., list(int) exitTypeList(ctx: p.TypeListContext) { const top = this.popType().unwrap() @@ -1070,6 +1076,17 @@ export class ToIrListener implements QuintListener { this.typeStack.push({ id, kind: 'fun', arg, res }) } + // The unit type + exitTypeUnit(ctx: p.TypeUnitContext) { + const id = this.getId(ctx) + + this.typeStack.push({ + id: id, + kind: 'tup', + fields: { kind: 'empty' }, + }) + } + // A tuple type, e.g., (int, bool) // the type stack contains the types of the elements exitTypeTuple(ctx: p.TypeTupleContext) { @@ -1305,7 +1322,15 @@ function unitValue(id: bigint): QuintBuiltinApp { return { id, kind: 'app', - opcode: 'Rec', + opcode: 'Tup', args: [], } } + +function popOrFail(stack: T[], msg: string): T { + const x = stack.pop() + if (typeof x === 'undefined') { + fail(`internal error: violated grammar guarantee ${msg}`) + } + return x +} diff --git a/quint/src/parsing/parseErrors.ts b/quint/src/parsing/parseErrors.ts index 40a771e00..0572470c4 100644 --- a/quint/src/parsing/parseErrors.ts +++ b/quint/src/parsing/parseErrors.ts @@ -25,3 +25,19 @@ export function tooManySpreadsError(id: bigint): QuintError { data: {}, } } + +export function undeclaredTypeParamsError(id: bigint, unboundTypeVariables: string[]): QuintError { + return { + code: 'QNT014', + message: `the type variables ${unboundTypeVariables.join(', ')} are unbound. +E.g., in + + type T = List[a] + +type variable 'a' is unbound. To fix it, write + + type T[a] = List[a]`, + reference: id, + data: {}, + } +} diff --git a/quint/src/parsing/quintParserFrontend.ts b/quint/src/parsing/quintParserFrontend.ts index 5d75fc28e..513b232ff 100644 --- a/quint/src/parsing/quintParserFrontend.ts +++ b/quint/src/parsing/quintParserFrontend.ts @@ -159,19 +159,29 @@ export function parsePhase2sourceResolution( mainPath: SourceLookupPath, mainPhase1Result: ParserPhase1 ): ParseResult { - // we accumulate the source map over all files here + // We accumulate the source map over all files here. let sourceMap = new Map(mainPhase1Result.sourceMap) - // The list of modules that have not been been processed yet. - // Each element of the list carries the module to be processed and the trail - // of sources that led to this module. - // The construction is similar to the worklist algorithm: + + // The list of modules that have not been been processed yet. Each element of + // the list carries the module to be processed and the trail of sources that + // led to this module. The construction is similar to the worklist algorithm: // https://en.wikipedia.org/wiki/Reaching_definition#Worklist_algorithm const worklist: [QuintModule, SourceLookupPath[]][] = mainPhase1Result.modules.map(m => [m, [mainPath]]) // Collect modules produced by every source. const sourceToModules = new Map() + // Collect visited paths, so we don't have to load the same file twice. + // Some filesystems are case-insensitive, whereas some are case sensitive. + // To prevent errors like #1194 from happening, we store both the + // original filename and its lower case version. If the user uses the same + // filename in different registers, we report an error. Otherwise, it would be + // quite hard to figure out tricky naming errors in the case-sensitive + // filesystems. We could also collect hashes of the files instead of + // lowercase filenames, but this looks a bit like overkill at the moment. + const visitedPaths = new Map() // Assign a rank to every module. The higher the rank, // the earlier the module should appear in the list of modules. sourceToModules.set(mainPath.normalizedPath, mainPhase1Result.modules) + visitedPaths.set(mainPath.normalizedPath.toLocaleLowerCase(), mainPath.normalizedPath) while (worklist.length > 0) { const [importer, pathTrail] = worklist.splice(0, 1)[0] for (const decl of importer.declarations) { @@ -179,9 +189,28 @@ export function parsePhase2sourceResolution( const importerPath = pathTrail[pathTrail.length - 1] const stemPath = sourceResolver.stempath(importerPath) const importeePath = sourceResolver.lookupPath(stemPath, decl.fromSource + '.qnt') - if (sourceToModules.has(importeePath.normalizedPath)) { - // The source has been parsed already. - continue + const importeeNormalized = importeePath.normalizedPath + const importeeLowerCase = importeeNormalized.toLowerCase() + if (visitedPaths.has(importeeLowerCase)) { + if (visitedPaths.get(importeeLowerCase) === importeeNormalized) { + // simply skip this import without parsing the same file twice + continue + } else { + // The source has been parsed already, but: + // - Either the same file is imported via paths in different cases, or + // - Two different files are imported via case-sensitive paths. + // Ask the user to disambiguate. + const original = + [...visitedPaths.values()].find( + name => name.toLowerCase() === importeeLowerCase && name !== importeeLowerCase + ) ?? importeeLowerCase + const err: QuintError = { + code: 'QNT408', + message: `Importing two files that only differ in case: ${original} vs. ${importeeNormalized}. Choose one way.`, + reference: decl.id, + } + return { ...mainPhase1Result, errors: mainPhase1Result.errors.concat([err]), sourceMap } + } } // try to load the source code const errorOrText = sourceResolver.load(importeePath) @@ -202,6 +231,7 @@ export function parsePhase2sourceResolution( worklist.push([m, pathTrail.concat([importeePath])]) }) sourceToModules.set(importeePath.normalizedPath, newModules) + visitedPaths.set(importeeLowerCase, importeeNormalized) sourceMap = new Map([...sourceMap, ...parseResult.sourceMap]) } } diff --git a/quint/src/quintAnalyzer.ts b/quint/src/quintAnalyzer.ts index 5d64b36ef..34412d745 100644 --- a/quint/src/quintAnalyzer.ts +++ b/quint/src/quintAnalyzer.ts @@ -22,6 +22,8 @@ import { ModeChecker } from './effects/modeChecker' import { QuintError } from './quintError' import { errorTreeToString } from './errorTree' import { MultipleUpdatesChecker } from './effects/MultipleUpdatesChecker' +import { TypeApplicationResolver } from './types/typeApplicationResolution' +import { NondetChecker } from './effects/NondetChecker' /* Products from static analysis */ export type AnalysisOutput = { @@ -36,22 +38,29 @@ export type AnalysisResult = [QuintError[], AnalysisOutput] /** * Analyzes multiple Quint modules and returns the analysis result. * + * NOTE: This is modifies the `lookupTable` and the `quintModules`! + * See XXX for the mutation sites. + * * @param lookupTable - The lookup tables for the modules. * @param quintModules - The Quint modules to be analyzed. * @returns A tuple with a list of errors and the analysis output. */ export function analyzeModules(lookupTable: LookupTable, quintModules: QuintModule[]): AnalysisResult { const analyzer = new QuintAnalyzer(lookupTable) - quintModules.map(m => analyzer.analyze(m)) + // XXX: the modules are mutated here. + quintModules.forEach(m => (m.declarations = analyzer.analyzeDeclarations(m.declarations))) return analyzer.getResult() } /** - * Analyzes a single Quint definition incrementally and returns the analysis result. + * Analyzes declarations incrementally and returns the analysis result. + * + * NOTE: This is modifies the `lookupTable`! + * See XXX for the mutation sites. * * @param analysisOutput - The previous analysis output to be used as a starting point. * @param lookupTable - The lookup tables for the modules. - * @param declaration - The Quint declaration to be analyzed. + * @param declarations - The Quint declarations to be analyzed. * @returns A tuple with a list of errors and the analysis output. */ export function analyzeInc( @@ -75,32 +84,37 @@ export function analyzeInc( * @param previousOutput - The previous analysis output to be used as a starting point. */ class QuintAnalyzer { + private typeApplicationResolver: TypeApplicationResolver private effectInferrer: EffectInferrer private typeInferrer: TypeInferrer private modeChecker: ModeChecker private multipleUpdatesChecker: MultipleUpdatesChecker + private nondetChecker: NondetChecker private errors: QuintError[] = [] private output: AnalysisOutput = { types: new Map(), effects: new Map(), modes: new Map() } constructor(lookupTable: LookupTable, previousOutput?: AnalysisOutput) { + // XXX: the lookUp table is mutated when TypeApplicationResolver is instantiated + this.typeApplicationResolver = new TypeApplicationResolver(lookupTable) this.typeInferrer = new TypeInferrer(lookupTable, previousOutput?.types) this.effectInferrer = new EffectInferrer(lookupTable, previousOutput?.effects) this.multipleUpdatesChecker = new MultipleUpdatesChecker() this.modeChecker = new ModeChecker(previousOutput?.modes) + this.nondetChecker = new NondetChecker(lookupTable) } - analyze(module: QuintModule): void { - this.analyzeDeclarations(module.declarations) - } + analyzeDeclarations(decls: QuintDeclaration[]): QuintDeclaration[] { + const [typAppErrMap, resolvedDecls] = this.typeApplicationResolver.resolveTypeApplications(decls) - analyzeDeclarations(decls: QuintDeclaration[]): void { - const [typeErrMap, types] = this.typeInferrer.inferTypes(decls) - const [effectErrMap, effects] = this.effectInferrer.inferEffects(decls) + // XXX: the lookUp table is mutated during type inference + const [typeErrMap, types] = this.typeInferrer.inferTypes(resolvedDecls) + const [effectErrMap, effects] = this.effectInferrer.inferEffects(resolvedDecls) const updatesErrMap = this.multipleUpdatesChecker.checkEffects([...effects.values()]) - const [modeErrMap, modes] = this.modeChecker.checkModes(decls, effects) + const nondetErrors = this.nondetChecker.checkNondets(types, resolvedDecls) + const [modeErrMap, modes] = this.modeChecker.checkModes(resolvedDecls, effects) - const errorTrees = [...typeErrMap, ...effectErrMap] + const errorTrees = [...typeErrMap, ...effectErrMap, ...typAppErrMap] // TODO: Type and effect checking should return QuintErrors instead of error trees this.errors.push( @@ -109,7 +123,7 @@ class QuintAnalyzer { }) ) - this.errors.push(...modeErrMap.values(), ...updatesErrMap.values()) + this.errors.push(...modeErrMap.values(), ...updatesErrMap.values(), ...nondetErrors) // We assume that ids are unique across modules, and map merging can be done // without collision checks @@ -118,6 +132,8 @@ class QuintAnalyzer { effects: new Map([...this.output.effects, ...effects]), modes: new Map([...this.output.modes, ...modes]), } + + return resolvedDecls } getResult(): AnalysisResult { diff --git a/quint/src/quintError.ts b/quint/src/quintError.ts index 81a8edd41..71c95f5f9 100644 --- a/quint/src/quintError.ts +++ b/quint/src/quintError.ts @@ -51,6 +51,8 @@ export type ErrorCode = | 'QNT012' /* QNT013: import ... from : could not load */ | 'QNT013' + /* QNT014: Type variables in a type declaration are not declared as parameters */ + | 'QNT014' /* QNT098: Cyclic imports */ | 'QNT098' /* QNT099: Found cyclic definitions */ @@ -65,6 +67,14 @@ export type ErrorCode = | 'QNT201' /* QNT202: Multiple updates of the same variable */ | 'QNT202' + /* QNT203: 'oneOf' must be used inside a nondet definition */ + | 'QNT203' + /* QNT204: 'oneOf' must be the outermost expression in a nondet definition */ + | 'QNT204' + /* QNT205: nondet bindings can only be used with boolean expressions */ + | 'QNT205' + /* QNT206: 'nondet' can only be used inside actions, not at the top level */ + | 'QNT206' /* QNT404: Name '' not found */ | 'QNT404' /* QNT405: Module '' not found */ @@ -73,7 +83,9 @@ export type ErrorCode = | 'QNT406' /* QNT407: Cannot import self */ | 'QNT407' - /* QNT500: Unitialized constant */ + /* QNT408: Case-sensitive filenames */ + | 'QNT408' + /* QNT500: Uninitialized constant */ | 'QNT500' /* QNT501: Internal compiler error */ | 'QNT501' @@ -99,6 +111,8 @@ export type ErrorCode = | 'QNT511' /* QNT512: Simulation failure */ | 'QNT512' + /* QNT513: Cannot continue in 'then' */ + | 'QNT513' /* Additional data for a Quint error */ export interface QuintErrorData { diff --git a/quint/src/quintVerifier.ts b/quint/src/quintVerifier.ts index 1f724ff16..3749c1b65 100644 --- a/quint/src/quintVerifier.ts +++ b/quint/src/quintVerifier.ts @@ -1,432 +1,20 @@ /* ---------------------------------------------------------------------------------- - * Copyright 2023 Informal Systems + * Copyright 2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. * --------------------------------------------------------------------------------- */ /** - * Interface to Apalache's model checking functionality - * - * This functionality is exposed thru the Apalache server. + * Core logic of verification * * @author Shon Feder * * @module */ -import { Either, chain, left, right } from '@sweet-monads/either' -import { ErrorMessage } from './ErrorMessage' -import path from 'path' -import fs from 'fs' -import os from 'os' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// import semver from 'semver' -import fetch from 'node-fetch' -import { pipeline } from 'stream/promises' -import child_process from 'child_process' -import * as tar from 'tar' -import * as grpc from '@grpc/grpc-js' -import * as proto from '@grpc/proto-loader' -import * as protobufDescriptor from 'protobufjs/ext/descriptor' -import { setTimeout } from 'timers/promises' -import { promisify } from 'util' -import { ItfTrace } from './itf' -import { verbosity } from './verbosity' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// import { request as octokitRequest } from '@octokit/request' - -import type { Buffer } from 'buffer' -import type { PackageDefinition as ProtoPackageDefinition } from '@grpc/proto-loader' - -const APALACHE_SERVER_URI = 'localhost:8822' -const APALACHE_VERSION_TAG = '0.42.0' -// TODO: used by GitHub api approach: https://github.com/informalsystems/quint/issues/1124 -// const APALACHE_TGZ = 'apalache.tgz' - -// The structure used to report errors -type VerifyError = { - explanation: string - errors: ErrorMessage[] - traces?: ItfTrace[] -} - -function quintConfigDir(): string { - return path.join(os.homedir(), '.quint') -} - -function apalacheDistDir(): string { - return path.join(quintConfigDir(), `apalache-dist-${APALACHE_VERSION_TAG}`) -} - -export type VerifyResult = Either - -// An object representing the Apalache configuration -// See https://github.com/informalsystems/apalache/blob/main/mod-infra/src/main/scala/at/forsyte/apalache/infra/passes/options.scala#L255 -type ApalacheConfig = any - -// Interface to the apalache server -// This is likely to be expanded in the future -type Apalache = { - // Run the check command with the given configuration - check: (c: ApalacheConfig) => Promise> -} - -function handleVerificationFailure(failure: { pass_name: string; error_data: any }): VerifyError { - switch (failure.pass_name) { - case 'SanyParser': - return { - explanation: `internal error: while parsing in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, - errors: [], - } - case 'TypeCheckerSnowcat': - return { - explanation: `internal error: while type checking in Apalache:\n'${failure.error_data}'\nPlease report an issue: https://github.com/informalsystems/quint/issues/new`, - errors: [], - } - case 'BoundedChecker': - switch (failure.error_data.checking_result) { - case 'Error': - return { explanation: 'found a counterexample', traces: failure.error_data.counterexamples, errors: [] } - case 'Deadlock': - return { explanation: 'reached a deadlock', traces: failure.error_data.counterexamples, errors: [] } - default: - throw new Error(`internal error: unhandled verification error ${failure.error_data.checking_result}`) - } - default: - throw new Error(`internal error: unhandled verification error at pass ${failure.pass_name}`) - } -} - -// Construct the Apalache interface around the cmdExecutor -function apalache(cmdExecutor: AsyncCmdExecutor): Apalache { - const check = async (c: ApalacheConfig): Promise> => { - const response = await cmdExecutor.run({ cmd: 'CHECK', config: JSON.stringify(c) }) - if (response.result == 'success') { - return right(void 0) - } else { - switch (response.failure.errorType) { - case 'UNEXPECTED': { - const errData = JSON.parse(response.failure.data) - return err(errData.msg) - } - case 'PASS_FAILURE': - return left(handleVerificationFailure(JSON.parse(response.failure.data))) - default: - // TODO handle other error cases - return err(`${response.failure.errorType}: ${response.failure.data}`) - } - } - } - - return { check } -} - -// Alias for an async callback for values of type T used to annotate -// callback-based methods so we can convert them into promise-based methods via -// promiseify. -type AsyncCallBack = (err: any, result: T) => void - -// The core grpc tooling doesn't support generation of typing info, -// we therefore record the structer we require from the grpc generation -// in the 6 following types. -// -// The types reflect https://github.com/informalsystems/apalache/blob/main/shai/src/main/protobuf/cmdExecutor.proto - -type RunRequest = { cmd: string; config: string } - -type RunResponse = - | { result: 'failure'; failure: { errorType: string; data: string } } - // The success data also includes the parsed module, but we don't need it - | { result: 'success' } - -// The interface for the CmdExecutor service generated by the gRPC library -type CmdExecutor = { - // Constructs a new client service - new (url: string, creds: any): CmdExecutor - run: (req: RunRequest, cb: AsyncCallBack) => void -} - -// The refined interface to the CmdExecutor we produce from the generated interface -type AsyncCmdExecutor = { - run: (req: RunRequest) => Promise -} - -// The interface for the Shai package -type ShaiPkg = { - cmdExecutor: { - CmdExecutor: CmdExecutor - } -} - -// Helper to construct errors results -function err(explanation: string, errors: ErrorMessage[] = [], traces?: ItfTrace[]): VerifyResult { - return left({ explanation, errors, traces }) -} - -// See https://grpc.io/docs/languages/node/basics/#example-code-and-setup -const grpcStubOptions = { - keepCase: true, - longs: String, - enums: String, - defaults: true, - oneofs: true, -} - -async function loadProtoDefViaReflection(retry: boolean): Promise> { - // Types of the gRPC interface - type ServerReflectionRequest = { file_containing_symbol: string } - type ServerReflectionResponseSuccess = { - file_descriptor_response: { - file_descriptor_proto: Buffer[] - } - } - type ServerReflectionResponseFailure = { - error_response: { - error_code: number - error_message: string - } - } - type ServerReflectionResponse = ServerReflectionResponseSuccess | ServerReflectionResponseFailure - type ServerReflectionService = { - new (url: string, creds: grpc.ChannelCredentials): ServerReflectionService - ServerReflectionInfo: () => grpc.ClientDuplexStream - getChannel: () => { getConnectivityState: (_: boolean) => grpc.connectivityState } - } - type ServerReflectionPkg = { - grpc: { reflection: { v1alpha: { ServerReflection: ServerReflectionService } } } - } - - // Obtain a reflection service client - const protoPath = require.resolve('./reflection.proto') - const packageDefinition = proto.loadSync(protoPath, grpcStubOptions) - const reflectionProtoDescriptor = grpc.loadPackageDefinition(packageDefinition) as unknown as ServerReflectionPkg - const serverReflectionService = reflectionProtoDescriptor.grpc.reflection.v1alpha.ServerReflection - const reflectionClient = new serverReflectionService(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) - - // Wait for gRPC channel to come up, with 1sec pauses - if (retry) { - for (;;) { - const grpcChannelState = reflectionClient.getChannel().getConnectivityState(true) - if (grpcChannelState == grpc.connectivityState.READY) { - break - } else { - /* I suspect that there is a race with async gRPC code that actually - * brings the connection up, so we need to yield control here. In - * particular, waiting for the channel to come up in a busy-waiting loop - * does NOT work. - */ - await setTimeout(1000) - } - } - } - - // Query reflection endpoint - return new Promise>((resolve, _) => { - const call = reflectionClient.ServerReflectionInfo() - call.on('data', (r: ServerReflectionResponse) => { - call.end() - resolve(right(r)) - }) - call.on('error', (e: grpc.StatusObject) => resolve(err(`Error querying reflection endpoint: ${e}`))) - - call.write({ file_containing_symbol: 'shai.cmdExecutor.CmdExecutor' }) - }).then(protoDefResponse => - protoDefResponse.chain(protoDefResponse => { - // Construct a proto definition of the reflection response. - if ('error_response' in protoDefResponse) { - return err( - `Apalache gRPC endpoint is corrupted. Could not extract proto file: ${protoDefResponse.error_response.error_message}` - ) - } +// TODO This module should subsume the pure logic from the verify commaind in cliCommand - // Decode reflection response to FileDescriptorProto - let fileDescriptorProtos = protoDefResponse.file_descriptor_response.file_descriptor_proto.map( - bytes => protobufDescriptor.FileDescriptorProto.decode(bytes) as protobufDescriptor.IFileDescriptorProto - ) - - // Use proto-loader to load the FileDescriptorProto wrapped in a FileDescriptorSet - return right(proto.loadFileDescriptorSetFromObject({ file: fileDescriptorProtos }, grpcStubOptions)) - }) - ) -} - -function loadGrpcClient(protoDef: ProtoPackageDefinition): AsyncCmdExecutor { - const protoDescriptor = grpc.loadPackageDefinition(protoDef) - // The cast thru `unkown` lets us convince the type system of anything - // See https://basarat.gitbook.io/typescript/type-system/type-assertion#double-assertion - const pkg = protoDescriptor.shai as unknown as ShaiPkg - const stub: any = new pkg.cmdExecutor.CmdExecutor(APALACHE_SERVER_URI, grpc.credentials.createInsecure()) - return { - run: promisify((data: RunRequest, cb: AsyncCallBack) => stub.run(data, cb)), - } -} - -/** - * Connect to the Apalache server, and verify that the gRPC channel is up. - * - * @param retry Wait for the gRPC connection to come up. - * - * @returns A promise resolving to a `right` if the connection is successful, or a `left` if not. - */ -async function tryConnect(retry: boolean = false): Promise> { - return (await loadProtoDefViaReflection(retry)).map(loadGrpcClient).map(apalache) -} - -function downloadAndUnpackApalache(): Promise> { - const url = `https://github.com/informalsystems/apalache/releases/download/v${APALACHE_VERSION_TAG}/apalache.tgz` - return fetch(url) - .then( - // unpack response body - res => pipeline(res.body, tar.extract({ cwd: apalacheDistDir(), strict: true })), - error => err(`Error fetching ${url}: ${error}`) - ) - .then( - _ => right(null), - error => err(`Error unpacking .tgz: ${error}`) - ) -} - -/** - * Fetch the latest Apalache release pinned by `APALACHE_VERSION_TAG` from Github. - * - * @returns A promise resolving to: - * - a `right` equal to the path the Apalache dist was unpacked to, - * - a `left` indicating an error. - */ -async function fetchApalache(verbosityLevel: number): Promise> { - const apalacheBinary = path.join(apalacheDistDir(), 'apalache', 'bin', 'apalache-mc') - if (fs.existsSync(apalacheBinary)) { - // Use existing download - debugLog(verbosityLevel, `Using existing Apalache distribution in ${apalacheBinary}`) - return right(apalacheBinary) - } else { - fs.mkdirSync(apalacheDistDir(), { recursive: true }) - process.stdout.write('Downloading Apalache distribution...') - const res = await downloadAndUnpackApalache() - process.stdout.write(' done.\n') - return res.map(_ => apalacheBinary) - } - - // TODO: This logic makes the CLI tool extremely sensitive to environment. - // See https://github.com/informalsystems/quint/issues/1124 - // Fetch Github releases - // return octokitRequest('GET /repos/informalsystems/apalache/releases').then( - // async resp => { - // // Find latest that satisfies `APALACHE_VERSION_TAG` - // const versions = resp.data.map((element: any) => element.tag_name) - // const latestTaggedVersion = semver.parse(semver.maxSatisfying(versions, APALACHE_VERSION_TAG)) - // if (latestTaggedVersion === null) { - // return err(`Failed to deteremine a valid semver version vesion from ${versions} and ${APALACHE_VERSION_TAG}`) - // } - // // Check if we have already downloaded this release - // const unpackPath = apalacheDistDir() - // const apalacheBinary = path.join(unpackPath, 'apalache', 'bin', 'apalache-mc') - // if (fs.existsSync(apalacheBinary)) { - // // Use existing download - // console.log(`Using existing Apalache distribution in ${unpackPath}`) - // return right(unpackPath) - // } else { - // // No existing download, download Apalache dist - // fs.mkdirSync(unpackPath, { recursive: true }) - - // // Filter release response to get dist archive asset URL - // const taggedRelease = resp.data.find((element: any) => element.tag_name == latestTaggedVersion) - // const tgzAsset = taggedRelease.assets.find((asset: any) => asset.name == APALACHE_TGZ) - // const downloadUrl = tgzAsset.browser_download_url - - // console.log(`Downloading Apalache distribution from ${downloadUrl}...`) - // return fetch(downloadUrl) - // .then( - // // unpack response body - // res => pipeline(res.body, tar.extract({ cwd: unpackPath, strict: true })), - // error => err(`Error fetching ${downloadUrl}: ${error}`) - // ) - // .then( - // _ => right(unpackPath), - // error => err(`Error unpacking .tgz: ${error}`) - // ) - // } - // }, - // error => err(`Error listing the Apalache releases: ${error}`) - // ) -} - -/** - * Connect to an already running Apalache server, or – if unsuccessful – fetch - * Apalache, spawn it, and connect to it. - * - * If an Apalache server is spawned, the child process exits when the parent process (i.e., this process) terminates. - * - * @returns A promise resolving to: - * - a `right` equal to the path the Apalache dist was unpacked to, - * - a `left` indicating an error. - */ -async function connect(verbosityLevel: number): Promise> { - // Try to connect to Shai, and try to ping it - const connectionResult = await tryConnect() - // We managed to connect, simply return this connection - if (connectionResult.isRight()) { - return connectionResult - } - - // Connection or pinging failed, download Apalache - debugLog(verbosityLevel, 'No running Apalache server found, launching...') - const exeResult = await fetchApalache(verbosityLevel) - // Launch Apalache from download - return exeResult - .asyncChain( - async exe => - new Promise>((resolve, _) => { - debugLog(verbosityLevel, 'Launching Apalache server') - const apalache = child_process.spawn(exe, ['server']) - - // Exit handler that kills Apalache if Quint exists - function exitHandler() { - debugLog(verbosityLevel, 'Shutting down Apalache server') - try { - process.kill(apalache.pid!) - } catch (error: any) { - // ESRCH is raised if no process with `pid` exists, i.e., - // if Apalache server exited on its own - if (error.code == 'ESRCH') { - debugLog(verbosityLevel, 'Apalache already exited') - } else { - throw error - } - } - } - - if (apalache.pid) { - // Apalache launched successfully - - // Install exit handler that kills Apalache if Quint exists - process.on('exit', exitHandler.bind(null)) - process.on('SIGINT', exitHandler.bind(null)) - process.on('SIGUSR1', exitHandler.bind(null)) - process.on('SIGUSR2', exitHandler.bind(null)) - process.on('uncaughtException', exitHandler.bind(null)) - - resolve(right(void 0)) - } - // If Apalache fails to spawn, `apalache.pid` is undefined and 'error' is - // emitted. - apalache.on('error', error => resolve(err(`Failed to launch Apalache server: ${error.message}`))) - }) - ) - .then(chain(() => tryConnect(true))) -} - -/** - * Log `msg` to the console if `verbosityLevel` implies debug output. - * - * @param verbosityLevel the current verbosity level (set with --verbosity) - * @param msg the message to log - */ -function debugLog(verbosityLevel: number, msg: string) { - if (verbosity.hasDebugInfo(verbosityLevel)) { - console.log(msg) - } -} +import { ApalacheResult, connect } from './apalache' /** * Verifies the configuration `config` by model checking it with the Apalache server @@ -436,7 +24,7 @@ function debugLog(verbosityLevel: number, msg: string) { * * @returns right(void) if verification succeeds, or left(err) explaining the failure */ -export async function verify(config: any, verbosityLevel: number): Promise> { +export async function verify(config: any, verbosityLevel: number): Promise> { const connectionResult = await connect(verbosityLevel) return connectionResult.asyncChain(conn => conn.check(config)) } diff --git a/quint/src/repl.ts b/quint/src/repl.ts index c2bc6c355..031abd708 100644 --- a/quint/src/repl.ts +++ b/quint/src/repl.ts @@ -25,7 +25,6 @@ import { compileFromCode, contextNameLookup, inputDefName, - lastTraceName, newCompilationState, } from './runtime/compile' import { createFinders, formatError } from './errorReporter' @@ -482,7 +481,6 @@ function saveVars(vars: Register[], nextvars: Register[]): Maybe { // In the future, we will declare them in a separate module. function simulatorBuiltins(st: CompilationState): QuintDef[] { return [ - parseDefOrThrow(`val ${lastTraceName} = []`, st.idGen, st.sourceMap), parseDefOrThrow(`def q::test = (q::nruns, q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), parseDefOrThrow(`def q::testOnce = (q::nsteps, q::init, q::next, q::inv) => false`, st.idGen, st.sourceMap), ] @@ -499,7 +497,8 @@ function tryEvalModule(out: writer, state: ReplState, mainName: string): boolean mainName, mainPath, state.evaluationState.listener, - state.rng.next + state.rng.next, + false ) if ( context.evaluationState?.context.size === 0 || @@ -557,7 +556,7 @@ function tryEval(out: writer, state: ReplState, newInput: string): boolean { } // evaluate the input, depending on its type if (parseResult.kind === 'expr') { - const context = compileExpr(state.compilationState, state.evaluationState, state.rng, parseResult.expr) + const context = compileExpr(state.compilationState, state.evaluationState, state.rng, false, parseResult.expr) if (context.syntaxErrors.length > 0 || context.compileErrors.length > 0 || context.analysisErrors.length > 0) { printErrors(out, state, context, newInput) @@ -582,7 +581,7 @@ function tryEval(out: writer, state: ReplState, newInput: string): boolean { } if (parseResult.kind === 'declaration') { // compile the module and add it to history if everything worked - const context = compileDecls(state.compilationState, state.evaluationState, state.rng, parseResult.decls) + const context = compileDecls(state.compilationState, state.evaluationState, state.rng, false, parseResult.decls) if ( context.evaluationState.context.size === 0 || diff --git a/quint/src/runtime/compile.ts b/quint/src/runtime/compile.ts index fbec5aeca..b34126606 100644 --- a/quint/src/runtime/compile.ts +++ b/quint/src/runtime/compile.ts @@ -24,7 +24,7 @@ import { flattenModules } from '../flattening/fullFlattener' import { QuintError } from '../quintError' /** - * The name of the shadow variable that stores the last found trace. + * The name of the builtin name that returns the last found trace. */ export const lastTraceName = 'q::lastTrace' @@ -132,6 +132,7 @@ export function contextNameLookup( * @param evaluationState the state of the compiler visitor * @param lookupTable lookup table as produced by the parser * @param rand the random number generator + * @param storeMetadata whether to store metadata in the trace states * @param defs the definitions to compile * @returns the compilation context */ @@ -140,11 +141,10 @@ export function compile( evaluationState: EvaluationState, lookupTable: LookupTable, rand: (bound: bigint) => bigint, + storeMetadata: boolean, defs: QuintDef[] ): CompilationContext { - const { analysisOutput } = compilationState - - const visitor = new CompilerVisitor(lookupTable, analysisOutput.types, rand, evaluationState) + const visitor = new CompilerVisitor(lookupTable, rand, evaluationState, storeMetadata) defs.forEach(def => walkDefinition(visitor, def)) @@ -169,6 +169,7 @@ export function compile( * @param state - The current compilation state * @param evaluationState - The current evaluation state * @param rng - The random number generator + * @param storeMetadata - whether to store metadata in the trace states * @param expr - The Quint exporession to be compiled * * @returns A compilation context with the compiled expression or its errors @@ -177,6 +178,7 @@ export function compileExpr( state: CompilationState, evaluationState: EvaluationState, rng: Rng, + storeMetadata: boolean, expr: QuintEx ): CompilationContext { // Create a definition to encapsulate the parsed expression. @@ -184,7 +186,7 @@ export function compileExpr( // Hence, we have to compile it via an auxilliary definition. const def: QuintDef = { kind: 'def', qualifier: 'action', name: inputDefName, expr, id: state.idGen.nextId() } - return compileDecls(state, evaluationState, rng, [def]) + return compileDecls(state, evaluationState, rng, storeMetadata, [def]) } /** @@ -195,6 +197,7 @@ export function compileExpr( * @param state - The current compilation state * @param evaluationState - The current evaluation state * @param rng - The random number generator + * @param storeMetadata - whether to store metadata in the trace states * @param decls - The Quint declarations to be compiled * * @returns A compilation context with the compiled definition or its errors @@ -203,6 +206,7 @@ export function compileDecls( state: CompilationState, evaluationState: EvaluationState, rng: Rng, + storeMetadata: boolean, decls: QuintDeclaration[] ): CompilationContext { if (state.originalModules.length === 0 || state.modules.length === 0) { @@ -253,7 +257,7 @@ export function compileDecls( // Filter definitions that were not compiled yet const defsToCompile = flatDefinitions.filter(d => !mainModule.declarations.some(d2 => d2.id === d.id)) - const ctx = compile(newState, evaluationState, flattenedTable, rng.next, defsToCompile) + const ctx = compile(newState, evaluationState, flattenedTable, rng.next, storeMetadata, defsToCompile) return { ...ctx, analysisErrors } } @@ -268,6 +272,7 @@ export function compileDecls( * @param mainName the name of the module that may contain state varibles * @param execListener execution listener * @param rand the random number generator + * @param storeMetadata whether to store metadata in the trace states * @returns the compilation context */ export function compileFromCode( @@ -276,7 +281,8 @@ export function compileFromCode( mainName: string, mainPath: SourceLookupPath, execListener: ExecutionListener, - rand: (bound: bigint) => bigint + rand: (bound: bigint) => bigint, + storeMetadata: boolean ): CompilationContext { // parse the module text // FIXME(#1052): We should build a proper sourceCode map from the files we previously loaded @@ -313,7 +319,14 @@ export function compileFromCode( }, ] const defsToCompile = main ? main.declarations : [] - const ctx = compile(compilationState, newEvaluationState(execListener), flattenedTable, rand, defsToCompile) + const ctx = compile( + compilationState, + newEvaluationState(execListener), + flattenedTable, + rand, + storeMetadata, + defsToCompile + ) return { ...ctx, diff --git a/quint/src/runtime/impl/compilerImpl.ts b/quint/src/runtime/impl/compilerImpl.ts index 5acb5886c..c47eef869 100644 --- a/quint/src/runtime/impl/compilerImpl.ts +++ b/quint/src/runtime/impl/compilerImpl.ts @@ -15,7 +15,6 @@ import { List, OrderedMap, Set } from 'immutable' import { LookupTable } from '../../names/base' import { IRVisitor } from '../../ir/IRVisitor' -import { TypeScheme } from '../../types/base' import { Callable, Computable, @@ -33,10 +32,14 @@ import { ExecutionListener } from '../trace' import * as ir from '../../ir/quintIr' import { RuntimeValue, RuntimeValueLambda, RuntimeValueVariant, rv } from './runtimeValue' +import { Trace } from './trace' import { ErrorCode, QuintError } from '../../quintError' import { inputDefName, lastTraceName } from '../compile' +import { prettyQuintEx, terminalWidth } from '../../graphics' +import { format } from '../../prettierimp' import { unreachable } from '../../util' +import { zerog } from '../../idGenerator' import { chunk } from 'lodash' // Internal names in the compiler, which have special treatment. @@ -69,8 +72,8 @@ export interface EvaluationState { vars: Register[] // The list of variables in the next state. nextVars: Register[] - // The list of shadow variables. - shadowVars: Register[] + // The current trace of states + trace: Trace // The error tracker for the evaluation to store errors on callbacks. errorTracker: CompilerErrorTracker // The execution listener that the compiled code uses to report execution info. @@ -100,25 +103,18 @@ export class CompilerErrorTracker { /** * Creates a new EvaluationState object with the initial state of the evaluation. * - * @returns a new EvaluationState object with the lastTrace shadow variable register + * @returns a new EvaluationState object */ export function newEvaluationState(listener: ExecutionListener): EvaluationState { const state: EvaluationState = { context: builtinContext(), vars: [], nextVars: [], - shadowVars: [], + trace: new Trace(), errorTracker: new CompilerErrorTracker(), listener: listener, } - // Initialize compiler state - const lastTrace = mkRegister('shadow', lastTraceName, just(rv.mkList([])), () => - state.errorTracker.addRuntimeError(0n, 'QNT501', 'q::lastTrace is not set') - ) - state.shadowVars.push(lastTrace) - state.context.set(kindName(lastTrace.kind, lastTrace.name), lastTrace) - return state } @@ -137,8 +133,6 @@ export function newEvaluationState(listener: ExecutionListener): EvaluationState export class CompilerVisitor implements IRVisitor { // the lookup table to use for the module private lookupTable: LookupTable - // types assigned to expressions and definitions - private types: Map // the stack of computable values private compStack: Computable[] = [] // The map of identifiers (and sometimes, names) to their compiled values: @@ -146,39 +140,51 @@ export class CompilerVisitor implements IRVisitor { // - an instance of Register // - an instance of Callable. // The keys should be constructed via `kindName`. - private context: Map + context: Map // all variables declared during compilation private vars: Register[] // the registers allocated for the next-state values of vars private nextVars: Register[] - // shadow variables that are used by the simulator - private shadowVars: Register[] // keeps errors in a state private errorTracker: CompilerErrorTracker // pre-initialized random number generator private rand // execution listener private execListener: ExecutionListener + // a tracker for the current execution trace + private trace: Trace + + // whether to track `actionTaken` and `nondetPicks` + private storeMetadata: boolean + // the chosen action in the last `any` evaluation + private actionTaken: Maybe = none() + // a record with nondet definition names as fields and their last chosen value as values + private nondetPicks: RuntimeValue // initialized at constructor + // the current depth of operator definitions: top-level defs are depth 0 + // FIXME(#1279): The walk* functions update this value, but they need to be + // initialized to -1 here for that to work on all scenarios. definitionDepth: number = -1 constructor( lookupTable: LookupTable, - types: Map, rand: (bound: bigint) => bigint, - evaluationState: EvaluationState + evaluationState: EvaluationState, + storeMetadata: boolean ) { this.lookupTable = lookupTable - this.types = types this.rand = rand + this.storeMetadata = storeMetadata this.context = evaluationState.context this.vars = evaluationState.vars this.nextVars = evaluationState.nextVars - this.shadowVars = evaluationState.shadowVars this.errorTracker = evaluationState.errorTracker this.execListener = evaluationState.listener + this.trace = evaluationState.trace + + this.nondetPicks = this.emptyNondetPicks() } /** @@ -189,19 +195,12 @@ export class CompilerVisitor implements IRVisitor { context: this.context, vars: this.vars, nextVars: this.nextVars, - shadowVars: this.shadowVars, errorTracker: this.errorTracker, listener: this.execListener, + trace: this.trace, } } - /** - * Get the compiled context. - */ - getContext(): Map { - return this.context - } - /** * Get the names of the compiled variables. */ @@ -209,13 +208,6 @@ export class CompilerVisitor implements IRVisitor { return this.vars.map(r => r.name) } - /** - * Get the names of the shadow variables. - */ - getShadowVars(): string[] { - return this.shadowVars.map(r => r.name) - } - /** * Get the array of compile errors, which changes as the code gets executed. */ @@ -233,7 +225,7 @@ export class CompilerVisitor implements IRVisitor { exitOpDef(opdef: ir.QuintOpDef) { // Either a runtime value, or a def, action, etc. // All of them are compiled to callables, which may have zero parameters. - let boundValue = this.compStack.pop() + let boundValue = this.compStack.pop() as Callable if (boundValue === undefined) { this.errorTracker.addCompileError(opdef.id, 'QNT501', `No expression for ${opdef.name} on compStack`) return @@ -254,6 +246,10 @@ export class CompilerVisitor implements IRVisitor { const evalApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: '_', args: [app] } boundValue = { eval: () => { + if (this.actionTaken.isNone()) { + this.actionTaken = just(rv.mkStr(opdef.name)) + } + if (app.opcode === inputDefName) { this.execListener.onUserOperatorCall(evalApp) // do not call onUserOperatorReturn on '_' later, as it may span over multiple frames @@ -264,6 +260,7 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorReturn(app, [], r) return r }, + nparams: unwrappedValue.nparams, } } @@ -281,6 +278,20 @@ export class CompilerVisitor implements IRVisitor { } } + if (opdef.qualifier === 'action' && opdef.expr.kind === 'lambda') { + const unwrappedValue = boundValue + boundValue = { + eval: (args?: Maybe[]) => { + if (this.actionTaken.isNone()) { + this.actionTaken = just(rv.mkStr(opdef.name)) + } + + return unwrappedValue.eval(args) + }, + nparams: unwrappedValue.nparams, + } + } + const kname = kindName('callable', opdef.id) // bind the callable from the stack this.context.set(kname, boundValue) @@ -322,13 +333,29 @@ export class CompilerVisitor implements IRVisitor { // a new random value may be produced later. const undecoratedEval = exprUnderLet.eval const boundValueEval = boundValue.eval - exprUnderLet.eval = function (): Maybe { + exprUnderLet.eval = () => { const cachedValue = boundValueEval() boundValue.eval = function () { return cachedValue } // compute the result and immediately reset the cache const result = undecoratedEval() + + // Store the nondet picks after evaluation as we want to collect them while we move up the IR tree, + // to make sure all nondet values in scenarios like this are collected: + // action step = any { + // someAction, + // nondet time = oneOf(times) + // timeRelatedAction(time) + // } + // + // action timeRelatedAction(time) = any { AdvanceTime(time), RevertTime(time) } + + if (result.isJust() && qualifier === 'nondet') { + // A nondet value was just defined, save it in the nondetPicks record. + const value = rv.mkVariant('Some', cachedValue.value as RuntimeValue) + this.nondetPicks = rv.mkRecord(this.nondetPicks.toOrderedMap().set(letDef.opdef.name, value)) + } boundValue.eval = boundValueEval return result } @@ -399,11 +426,14 @@ export class CompilerVisitor implements IRVisitor { } enterName(name: ir.QuintName) { + if (name.name === lastTraceName) { + this.compStack.push(mkConstComputable(rv.mkList(this.trace.get()))) + return + } // The name belongs to one of the objects: // a shadow variable, a variable, an argument, a callable. // The order is important, as defines the name priority. const comp = - this.contextGet(name.name, ['shadow']) ?? this.contextLookup(name.id, ['arg', 'var', 'callable']) ?? // a backup case for Nat, Int, and Bool, and special names such as q::input this.contextGet(name.name, ['arg', 'callable']) @@ -915,6 +945,10 @@ export class CompilerVisitor implements IRVisitor { }) break + case 'expect': + this.translateExpect(app) + break + case 'assert': this.applyFun(app.id, 1, cond => { if (!cond.toBool()) { @@ -939,6 +973,15 @@ export class CompilerVisitor implements IRVisitor { this.testOnce(app.id) break + case 'q::debug': + this.applyFun(app.id, 2, (msg, value) => { + let columns = terminalWidth() + let valuePretty = format(columns, 0, prettyQuintEx(value.toQuintEx(zerog))) + console.log('>', msg.toStr(), valuePretty.toString()) + return just(value) + }) + break + // standard unary operators that are not handled by REPL case 'allLists': case 'chooseSome': @@ -991,7 +1034,7 @@ export class CompilerVisitor implements IRVisitor { // this function gives us access to the compiled operator later let callableRef: () => Maybe - if (lookupEntry === undefined || lookupEntry.kind !== 'param') { + if (lookupEntry.kind !== 'param') { // The common case: the operator has been defined elsewhere. // We simply look up for the operator and return it via callableRef. const callable = this.contextLookup(app.id, ['callable']) as Callable @@ -1239,11 +1282,22 @@ export class CompilerVisitor implements IRVisitor { } } - // compute all { ... } or A.then(B)...then(E) for a chain of actions - private chainAllOrThen(actions: Computable[], kind: 'all' | 'then'): Maybe { + /** + * Compute all { ... } or A.then(B)...then(E) for a chain of actions. + * @param actions actions as computable to execute + * @param kind is it 'all { ... }' or 'A.then(B)'? + * @param actionId given the action index, return the id that produced this action + * @returns evaluation result + */ + private chainAllOrThen( + actions: Computable[], + kind: 'all' | 'then', + actionId: (idx: number) => bigint + ): Maybe { // save the values of the next variables, as actions may update them const savedValues = this.snapshotNextVars() - const savedTrace = this.trace() + const savedTrace = this.trace.get() + let result: Maybe = just(rv.mkBool(true)) // Evaluate arguments iteratively. // Stop as soon as one of the arguments returns false. @@ -1252,22 +1306,35 @@ export class CompilerVisitor implements IRVisitor { for (const action of actions) { nactionsLeft-- result = action.eval() - if (result.isNone() || !(result.value as RuntimeValue).toBool()) { + const isFalse = result.isJust() && !(result.value as RuntimeValue).toBool() + if (result.isNone() || isFalse) { // As soon as one of the arguments does not evaluate to true, // break out of the loop. // Restore the values of the next variables, // as evaluation was not successful. this.recoverNextVars(savedValues) - this.resetTrace(just(rv.mkList(savedTrace))) - break + this.trace.reset(savedTrace) + + if (kind === 'then' && nactionsLeft > 0 && isFalse) { + // Cannot extend a run. Emit an error message. + const actionNo = actions.length - (nactionsLeft + 1) + this.errorTracker.addRuntimeError( + actionId(actionNo), + 'QNT513', + `Cannot continue in A.then(B), A evaluates to 'false'` + ) + return none() + } else { + return result + } } // switch to the next frame, when implementing A.then(B) if (kind === 'then' && nactionsLeft > 0) { const oldState: RuntimeValue = this.varsToRecord() this.shiftVars() - this.extendTrace() const newState: RuntimeValue = this.varsToRecord() + this.trace.extend(newState) this.execListener.onNextState(oldState, newState) } } @@ -1284,7 +1351,62 @@ export class CompilerVisitor implements IRVisitor { const args = this.compStack.splice(-app.args.length) const kind = app.opcode === 'then' ? 'then' : 'all' - const lazyCompute = () => this.chainAllOrThen(args, kind) + const lazyCompute = () => this.chainAllOrThen(args, kind, idx => app.args[idx].id) + + this.compStack.push(mkFunComputable(lazyCompute)) + } + + // Translate A.expect(P): + // - Evaluate A. + // - When A's result is 'false', emit a runtime error. + // - When A's result is 'true': + // - Commit the variable updates: Shift the primed variables to unprimed. + // - Evaluate `P`. + // - If `P` evaluates to `false`, emit a runtime error (similar to `assert`). + // - If `P` evaluates to `true`, rollback to the previous state and return `true`. + private translateExpect(app: ir.QuintApp): void { + // The code below is an adaption of chainAllOrThen. + // If someone finds how to nicely combine both, please refactor. + if (this.compStack.length !== 2) { + this.errorTracker.addCompileError(app.id, 'QNT501', `Not enough arguments on stack for "${app.opcode}"`) + return + } + const [action, pred] = this.compStack.splice(-2) + const lazyCompute = (): Maybe => { + const savedNextVars = this.snapshotNextVars() + const savedTrace = this.trace.get() + const actionResult = action.eval() + if (actionResult.isNone() || !(actionResult.value as RuntimeValue).toBool()) { + // 'A' evaluates to 'false', or produces an error. + // Restore the values of the next variables. + this.recoverNextVars(savedNextVars) + this.trace.reset(savedTrace) + // expect emits an error when the run could not finish + this.errorTracker.addRuntimeError(app.args[0].id, 'QNT508', 'Cannot continue to "expect"') + return none() + } else { + const savedVarsAfterAction = this.snapshotVars() + const savedNextVarsAfterAction = this.snapshotNextVars() + const savedTraceAfterAction = this.trace.get() + // Temporarily, switch to the next frame, to make a look-ahead evaluation. + // For example, if `x == 1` and `x' == 2`, we would have `x == 2` and `x'` would be undefined. + this.shiftVars() + // evaluate P + const predResult = pred.eval() + // Recover the assignments to unprimed and primed variables. + // E.g., we recover variables to `x == 1` and `x' == 2` in the above example. + // This lets us combine the result of `expect` with other actions via `then`. + // For example: `A.expect(P).then(B)`. + this.recoverVars(savedVarsAfterAction) + this.recoverNextVars(savedNextVarsAfterAction) + this.trace.reset(savedTraceAfterAction) + if (predResult.isNone() || !(predResult.value as RuntimeValue).toBool()) { + this.errorTracker.addRuntimeError(app.args[1].id, 'QNT508', 'Expect condition does not hold true') + return none() + } + return predResult + } + } this.compStack.push(mkFunComputable(lazyCompute)) } @@ -1311,7 +1433,9 @@ export class CompilerVisitor implements IRVisitor { }, } }) - return this.chainAllOrThen(actions, 'then') + // In case the case of reps, we have multiple copies of the same action. + // This is why all occurrences have the same id. + return this.chainAllOrThen(actions, 'then', _ => app.args[1].id) }) .join() } @@ -1373,6 +1497,13 @@ export class CompilerVisitor implements IRVisitor { // non-deterministically. Instead of modeling non-determinism, // we use a random number generator. This may change in the future. const lazyCompute = () => { + // on `any`, we reset the action taken as the goal is to save the last + // action picked in an `any` call + this.actionTaken = none() + // we also reset nondet picks as they are collected when we move up the + // tree, and this is now a leaf + this.nondetPicks = this.emptyNondetPicks() + // save the values of the next variables, as actions may update them const valuesBefore = this.snapshotNextVars() // we store the potential successor values in this array @@ -1493,7 +1624,7 @@ export class CompilerVisitor implements IRVisitor { const nruns = (nrunsRes as RuntimeValue).toInt() for (let runNo = 0; !errorFound && !failure && runNo < nruns; runNo++) { this.execListener.onRunCall() - this.resetTrace() + this.trace.reset() // check Init() const initApp: ir.QuintApp = { id: 0n, kind: 'app', opcode: 'q::initAndInvariant', args: [] } this.execListener.onUserOperatorCall(initApp) @@ -1505,7 +1636,7 @@ export class CompilerVisitor implements IRVisitor { // The initial action evaluates to true. // Our guess of values was good. this.shiftVars() - this.extendTrace() + this.trace.extend(this.varsToRecord()) // check the invariant Inv const invResult = inv.eval() this.execListener.onUserOperatorReturn(initApp, [], initResult) @@ -1525,9 +1656,10 @@ export class CompilerVisitor implements IRVisitor { this.execListener.onUserOperatorCall(nextApp) const nextResult = next.eval() failure = nextResult.isNone() || failure + if (isTrue(nextResult)) { this.shiftVars() - this.extendTrace() + this.trace.extend(this.varsToRecord()) errorFound = !isTrue(inv.eval()) this.execListener.onUserOperatorReturn(nextApp, [], nextResult) } else { @@ -1539,14 +1671,14 @@ export class CompilerVisitor implements IRVisitor { // drop the run. Otherwise, we would have a lot of false // positives, which look like deadlocks but they are not. this.execListener.onUserOperatorReturn(nextApp, [], nextResult) - this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace().toArray()) + this.execListener.onRunReturn(just(rv.mkBool(true)), this.trace.get()) break } } } } const outcome = !failure ? just(rv.mkBool(!errorFound)) : none() - this.execListener.onRunReturn(outcome, this.trace().toArray()) + this.execListener.onRunReturn(outcome, this.trace.get()) // recover the state variables this.recoverVars(vars) this.recoverNextVars(nextVars) @@ -1560,35 +1692,19 @@ export class CompilerVisitor implements IRVisitor { this.compStack.push(mkFunComputable(doRun)) } - private trace(): List { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace && trace.registerValue.isJust()) { - return trace.registerValue.value.toList() - } else { - return List() - } - } - - private resetTrace(value: Maybe = just(rv.mkList([]))) { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace) { - trace.registerValue = value - } - } - - private extendTrace() { - let trace = this.shadowVars.find(r => r.name === lastTraceName) - if (trace) { - const extended = this.trace().push(this.varsToRecord()) - trace.registerValue = just(rv.mkList(extended)) - } - } - // convert the current variable values to a record private varsToRecord(): RuntimeValue { const map: [string, RuntimeValue][] = this.vars .filter(r => r.registerValue.isJust()) .map(r => [r.name, r.registerValue.value as RuntimeValue]) + + if (this.storeMetadata) { + if (this.actionTaken.isJust()) { + map.push(['action_taken', this.actionTaken.value!]) + map.push(['nondet_picks', this.nondetPicks]) + } + } + return rv.mkRecord(map) } @@ -1599,22 +1715,36 @@ export class CompilerVisitor implements IRVisitor { // save the values of the vars into an array private snapshotVars(): Maybe[] { - return this.vars.map(r => r.registerValue) + return this.vars.map(r => r.registerValue).concat([this.actionTaken, just(this.nondetPicks)]) } // save the values of the next vars into an array private snapshotNextVars(): Maybe[] { - return this.nextVars.map(r => r.registerValue) + return this.nextVars.map(r => r.registerValue).concat([this.actionTaken, just(this.nondetPicks)]) } // load the values of the variables from an array private recoverVars(values: Maybe[]) { this.vars.forEach((r, i) => (r.registerValue = values[i])) + this.actionTaken = values[this.vars.length] ?? none() + this.nondetPicks = values[this.vars.length + 1].unwrap() } // load the values of the next variables from an array private recoverNextVars(values: Maybe[]) { this.nextVars.forEach((r, i) => (r.registerValue = values[i])) + this.actionTaken = values[this.vars.length] ?? none() + this.nondetPicks = values[this.vars.length + 1].unwrap() + } + + // The initial value of nondet picks should already have record fields for all + // nondet values so the type of `nondet_picks` is the same throughout the + // trace. The field values are initialized as None. + private emptyNondetPicks() { + const nondetNames = [...this.lookupTable.values()] + .filter(d => d.kind === 'def' && d.qualifier === 'nondet') + .map(d => d.name) + return rv.mkRecord(OrderedMap(nondetNames.map(n => [n, rv.mkVariant('None', rv.mkTuple([]))]))) } private contextGet(name: string | bigint, kinds: ComputableKind[]) { diff --git a/quint/src/runtime/impl/runtimeValue.ts b/quint/src/runtime/impl/runtimeValue.ts index a7ecfde25..250e8350e 100644 --- a/quint/src/runtime/impl/runtimeValue.ts +++ b/quint/src/runtime/impl/runtimeValue.ts @@ -488,19 +488,23 @@ abstract class RuntimeValueBase implements RuntimeValue { } toSet(): Set { - // the default transformation to a set is done via iteration - let set = Set.of() - for (const e of this) { - set = set.add(e.normalForm()) + if (this.isSetLike) { + // the default transformation to a set is done via iteration + let set = Set.of() + for (const e of this) { + set = set.add(e.normalForm()) + } + return set + } else { + throw new Error('Expected a set-like value') } - return set } toList(): List { if (this instanceof RuntimeValueTupleOrList) { return this.list } else { - return List() + throw new Error('Expected a list value') } } @@ -508,7 +512,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueRecord) { return this.map } else { - return OrderedMap() + throw new Error('Expected a record value') } } @@ -516,7 +520,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueMap) { return this.map } else { - return Map() + throw new Error('Expected a map value') } } @@ -524,7 +528,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueBool) { return (this as RuntimeValueBool).value } else { - return false + throw new Error('Expected a Boolean value') } } @@ -532,7 +536,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueInt) { return (this as RuntimeValueInt).value } else { - return 0n + throw new Error('Expected an integer value') } } @@ -540,7 +544,7 @@ abstract class RuntimeValueBase implements RuntimeValue { if (this instanceof RuntimeValueStr) { return (this as RuntimeValueStr).value } else { - return '' + throw new Error('Expected a string value') } } diff --git a/quint/src/runtime/impl/trace.ts b/quint/src/runtime/impl/trace.ts new file mode 100644 index 000000000..987dc548d --- /dev/null +++ b/quint/src/runtime/impl/trace.ts @@ -0,0 +1,32 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Trace of states representing a single execution path + * + * @author Gabriela Moreira + * + * @module + */ + +import { List } from 'immutable' +import { RuntimeValue } from './runtimeValue' + +export class Trace { + private states: List = List() + + get(): RuntimeValue[] { + return this.states.toArray() + } + + reset(values: RuntimeValue[] = []) { + this.states = List(values) + } + + extend(state: RuntimeValue) { + this.states = this.states.push(state) + } +} diff --git a/quint/src/runtime/runtime.ts b/quint/src/runtime/runtime.ts index 4bda5b356..0b4a51dbf 100644 --- a/quint/src/runtime/runtime.ts +++ b/quint/src/runtime/runtime.ts @@ -59,7 +59,7 @@ export interface Computable { /** * The kind of a computable. */ -export type ComputableKind = 'var' | 'nextvar' | 'arg' | 'callable' | 'shadow' +export type ComputableKind = 'var' | 'nextvar' | 'arg' | 'callable' /** * Create a key that encodes its name and kind. This is only useful for diff --git a/quint/src/runtime/testing.ts b/quint/src/runtime/testing.ts index 203d30bba..16f450eee 100644 --- a/quint/src/runtime/testing.ts +++ b/quint/src/runtime/testing.ts @@ -9,17 +9,15 @@ */ import { Either, left, mergeInMany, right } from '@sweet-monads/either' -import { just } from '@sweet-monads/maybe' import { QuintEx, QuintOpDef } from '../ir/quintIr' -import { CompilationContext, CompilationState, compile, lastTraceName } from './compile' +import { CompilationContext, CompilationState, compile } from './compile' import { zerog } from './../idGenerator' import { LookupTable } from '../names/base' -import { Computable, Register, kindName } from './runtime' +import { Computable, kindName } from './runtime' import { ExecutionFrame, newTraceRecorder } from './trace' import { Rng } from '../rng' -import { RuntimeValue, rv } from './impl/runtimeValue' import { newEvaluationState } from './impl/compilerImpl' import { QuintError } from '../quintError' @@ -74,7 +72,9 @@ export interface TestResult { * @param lookupTable lookup table as produced by the parser * @param analysisOutput the maps produced by the static analysis * @param options misc test options - * @returns the results of running the tests + * @returns the `right(results)` of running the tests if the tests could be + * run, or `left(errors)` with any compilation or analysis errors that + * prevent the tests from running */ export function compileAndTest( compilationState: CompilationState, @@ -82,13 +82,27 @@ export function compileAndTest( lookupTable: LookupTable, options: TestOptions ): Either { - const recorder = newTraceRecorder(options.verbosity, options.rng) const main = compilationState.modules.find(m => m.name === mainName) if (!main) { return left([{ code: 'QNT405', message: `Main module ${mainName} not found` }]) } - const ctx = compile(compilationState, newEvaluationState(recorder), lookupTable, options.rng.next, main.declarations) + const recorder = newTraceRecorder(options.verbosity, options.rng) + const ctx = compile( + compilationState, + newEvaluationState(recorder), + lookupTable, + options.rng.next, + false, + main.declarations + ) + + const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors, ctx.analysisErrors) + if (ctxErrors.length > 0) { + // In principle, these errors should have been caught earlier. + // But if they did not, return immediately. + return left(ctxErrors) + } const saveTrace = (index: number, name: string, status: string) => { // Save the best traces that are reported by the recorder: @@ -104,13 +118,6 @@ export function compileAndTest( ) } - const ctxErrors = ctx.syntaxErrors.concat(ctx.compileErrors).concat(ctx.analysisErrors) - if (ctxErrors.length > 0) { - // In principle, these errors should have been caught earlier. - // But if they did not, return immediately. - return left(ctxErrors) - } - const testDefs = main.declarations.filter(d => d.kind === 'def' && options.testMatch(d.name)) as QuintOpDef[] return mergeInMany( @@ -128,15 +135,14 @@ export function compileAndTest( seed = options.rng.getState() recorder.onRunCall() // reset the trace - const traceReg = ctx.evaluationState.context.get(kindName('shadow', lastTraceName)) as Register - traceReg.registerValue = just(rv.mkList([])) + ctx.evaluationState.trace.reset() // run the test const result = comp.eval() // extract the trace - const trace = traceReg.eval() + const trace = ctx.evaluationState.trace.get() - if (trace.isJust()) { - recorder.onRunReturn(result, [...(trace.value as RuntimeValue).toList()]) + if (trace.length > 0) { + recorder.onRunReturn(result, trace) } else { // Report a non-critical error console.error('Missing a trace') diff --git a/quint/src/simulation.ts b/quint/src/simulation.ts index 7282b6d2e..008a4774f 100644 --- a/quint/src/simulation.ts +++ b/quint/src/simulation.ts @@ -10,7 +10,7 @@ import { Either } from '@sweet-monads/either' -import { compileFromCode, contextNameLookup, lastTraceName } from './runtime/compile' +import { compileFromCode, contextNameLookup } from './runtime/compile' import { QuintEx } from './ir/quintIr' import { Computable } from './runtime/runtime' import { ExecutionFrame, newTraceRecorder } from './runtime/trace' @@ -18,6 +18,9 @@ import { IdGenerator } from './idGenerator' import { Rng } from './rng' import { SourceLookupPath } from './parsing/sourceResolver' import { QuintError } from './quintError' +import { mkErrorMessage } from './cliCommands' +import { createFinders, formatError } from './errorReporter' +import assert from 'assert' /** * Various settings that have to be passed to the simulator to run. @@ -30,29 +33,33 @@ export interface SimulatorOptions { maxSteps: number rng: Rng verbosity: number + storeMetadata: boolean } -export type SimulatorResultStatus = 'ok' | 'violation' | 'failure' | 'error' +/** The outcome of a simulation + */ +export type Outcome = + | { status: 'ok' } /** Simulation succeeded */ + | { status: 'violation' } /** Simulation found an invariant violation */ + | { status: 'error'; errors: QuintError[] } /** An error occurred during simulation */ /** * A result returned by the simulator. */ export interface SimulatorResult { - status: SimulatorResultStatus + outcome: Outcome vars: string[] states: QuintEx[] frames: ExecutionFrame[] - errors: QuintError[] seed: bigint } -function errSimulationResult(status: SimulatorResultStatus, errors: QuintError[]): SimulatorResult { +function errSimulationResult(errors: QuintError[]): SimulatorResult { return { - status, + outcome: { status: 'error', errors }, vars: [], states: [], frames: [], - errors: errors, seed: 0n, } } @@ -88,7 +95,6 @@ export function compileAndRun( const o = options // Defs required by the simulator, to be added to the main module before compilation const extraDefs = [ - `val ${lastTraceName} = [];`, `def q::test(q::nrunsArg, q::nstepsArg, q::initArg, q::nextArg, q::invArg) = false`, `action q::init = { ${o.init} }`, `action q::step = { ${o.step} }`, @@ -97,45 +103,87 @@ export function compileAndRun( ] // Construct the modules' code, adding the extra definitions to the main module - const newMainModuleCode = code.slice(mainStart, mainEnd - 1) + extraDefs.join('\n') + const newMainModuleCode = code.slice(mainStart, mainEnd - 1) + '\n' + extraDefs.join('\n') const codeWithExtraDefs = code.slice(0, mainStart) + newMainModuleCode + code.slice(mainEnd) const recorder = newTraceRecorder(options.verbosity, options.rng) - const ctx = compileFromCode(idGen, codeWithExtraDefs, mainName, mainPath, recorder, options.rng.next) + const ctx = compileFromCode( + idGen, + codeWithExtraDefs, + mainName, + mainPath, + recorder, + options.rng.next, + options.storeMetadata + ) + + const compilationErrors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) + if (compilationErrors.length > 0) { + return errSimulationResult(compilationErrors) + } - if (ctx.compileErrors.length > 0 || ctx.syntaxErrors.length > 0 || ctx.analysisErrors.length > 0) { - const errors = ctx.syntaxErrors.concat(ctx.analysisErrors).concat(ctx.compileErrors) - return errSimulationResult('error', errors) + // evaluate q::runResult, which triggers the simulator + const evaluationState = ctx.evaluationState + const res: Either = contextNameLookup(evaluationState.context, 'q::runResult', 'callable') + if (res.isLeft()) { + const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] + return errSimulationResult(errors) } else { - // evaluate q::runResult, which triggers the simulator - const evaluationState = ctx.evaluationState - const res: Either = contextNameLookup(evaluationState.context, 'q::runResult', 'callable') - if (res.isLeft()) { - const errors = [{ code: 'QNT512', message: res.value }] as QuintError[] - return errSimulationResult('error', errors) - } else { - const _ = res.value.eval() - } + res.value.eval() + } - const topFrame = recorder.getBestTrace() - let status: SimulatorResultStatus = 'failure' - if (topFrame.result.isJust()) { - const ex = topFrame.result.unwrap().toQuintEx(idGen) - if (ex.kind === 'bool') { - status = ex.value ? 'ok' : 'violation' - } - } else { - // This should not happen. But if it does, give a debugging hint. - console.error('No trace recorded') - } + const topFrame: ExecutionFrame = recorder.getBestTrace() + + // Validate required outcome of correct simulation + const maybeEvalResult = topFrame.result + assert(maybeEvalResult.isJust(), 'invalid simulation failed to produce a result') + const quintExResult = maybeEvalResult.value.toQuintEx(idGen) + assert(quintExResult.kind === 'bool', 'invalid simulation produced non-boolean value ') + const simulationSucceeded = quintExResult.value + const vars = evaluationState.vars.map(v => v.name) + const states = topFrame.args.map(e => e.toQuintEx(idGen)) + const frames = topFrame.subframes + const seed = recorder.getBestTraceSeed() + + const runtimeErrors = ctx.getRuntimeErrors() + if (runtimeErrors.length > 0) { + // FIXME(#1052) we shouldn't need to do this if the error id was not some non-sense generated in `compileFromCode` + // The evaluated code source is not included in the context, so we crete a version with it for the error reporter + const code = new Map([...ctx.compilationState.sourceCode.entries(), [mainPath.normalizedPath, codeWithExtraDefs]]) + const finders = createFinders(code) + + const locatedErrors = runtimeErrors.map(error => ({ + code: error.code, + // Include the location information (locs) in the error message - this + // is the hacky part, as it should only be included at the CLI level + message: formatError(code, finders, { + // This will create the `locs` attribute and an explanation + ...mkErrorMessage(ctx.compilationState.sourceMap)(error), + // We override the explanation to keep the original one to avoid + // duplication, since `mkErrorMessage` will be called again at the CLI + // level. `locs` won't be touched then because this error doesn't + // include a `reference` field + explanation: error.message, + }), + })) + + // This should be kept after the hack is removed return { - status: status, - vars: evaluationState.vars.map(v => v.name), - states: topFrame.args.map(e => e.toQuintEx(idGen)), - frames: topFrame.subframes, - errors: ctx.getRuntimeErrors(), - seed: recorder.getBestTraceSeed(), + vars, + states, + frames, + seed, + outcome: { status: 'error', errors: locatedErrors }, } } + + const status = simulationSucceeded ? 'ok' : 'violation' + return { + vars, + states, + frames, + seed, + outcome: { status }, + } } diff --git a/quint/src/types/base.ts b/quint/src/types/base.ts index 3f66d009f..4ba069a3c 100644 --- a/quint/src/types/base.ts +++ b/quint/src/types/base.ts @@ -13,14 +13,37 @@ export type Constraint = /// the empty constraint (always satisfied) | { kind: 'empty' } -export interface TypeScheme { - type: QuintType +/** The constraint kinds, in order of "generality" + * + * Constraint solving is order dependent, and we need the most general constraints + * to be solved first. "More general" is here understood to mean "requires less + * information to solve correctly". + */ +const constraintKinds = ['empty', 'eq', 'conjunction', 'isDefined'] as const + +export interface QuantifiedVariables { typeVariables: Set rowVariables: Set } +export type TypeScheme = { type: QuintType } & QuantifiedVariables + export type Signature = (_arity: number) => TypeScheme +// Does not bind any type variables in `type`, which we take to assume +// that `type` has no free variables in the context. export function toScheme(type: QuintType): TypeScheme { return { typeVariables: new Set([]), rowVariables: new Set([]), type } } + +/** compares two constraints based on the order of generality of their kind + * + * @returns a negative value if the kind of the first constraint is more general than the second, + * a positive value if the kind of the first constraint is more specific than the second, + * and 0 if the two constraints are the same kind. + */ +export function compareConstraints(a: Constraint, b: Constraint): number { + const aIdx: number = constraintKinds.findIndex(s => s === a.kind) + const bIdx: number = constraintKinds.findIndex(s => s === b.kind) + return aIdx - bIdx +} diff --git a/quint/src/types/builtinSignatures.ts b/quint/src/types/builtinSignatures.ts index 9ed5fb65d..fecaa0308 100644 --- a/quint/src/types/builtinSignatures.ts +++ b/quint/src/types/builtinSignatures.ts @@ -122,9 +122,12 @@ const otherOperators = [ { name: 'assign', type: '(a, a) => bool' }, { name: 'ite', type: '(bool, a, a) => a' }, { name: 'then', type: '(bool, bool) => bool' }, + { name: 'expect', type: '(bool, bool) => bool' }, { name: 'reps', type: '(int, int => bool) => bool' }, { name: 'fail', type: '(bool) => bool' }, { name: 'assert', type: '(bool) => bool' }, + { name: 'q::debug', type: '(str, a) => a' }, + { name: 'q::lastTrace', type: 'List[a]' }, ] function uniformArgsWithResult(argsType: string, resultType: string): Signature { diff --git a/quint/src/types/constraintGenerator.ts b/quint/src/types/constraintGenerator.ts index e17bdcafa..ccaafe581 100644 --- a/quint/src/types/constraintGenerator.ts +++ b/quint/src/types/constraintGenerator.ts @@ -1,5 +1,5 @@ /* ---------------------------------------------------------------------------------- - * Copyright 2022 Informal Systems + * Copyright 2022-2024 Informal Systems * Licensed under the Apache License, Version 2.0. * See LICENSE in the project root for license information. * --------------------------------------------------------------------------------- */ @@ -18,7 +18,7 @@ import { QuintAssume, QuintBool, QuintConst, - QuintDef, + QuintDeclaration, QuintEx, QuintInstance, QuintInt, @@ -30,12 +30,12 @@ import { QuintVar, isAnnotatedDef, } from '../ir/quintIr' -import { QuintType, rowNames, typeNames } from '../ir/quintTypes' +import { QuintType, QuintVarType, rowNames, typeNames } from '../ir/quintTypes' import { expressionToString, rowToString, typeToString } from '../ir/IRprinting' import { Either, left, mergeInMany, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree, errorTreeToString } from '../errorTree' import { getSignatures } from './builtinSignatures' -import { Constraint, Signature, TypeScheme, toScheme } from './base' +import { Constraint, QuantifiedVariables, Signature, TypeScheme, toScheme } from './base' import { Substitutions, applySubstitution, compose } from './substitutions' import { LookupTable } from '../names/base' import { @@ -82,6 +82,8 @@ function validateArity( } // A visitor that collects types and constraints for a module's expressions +// +// NOTE: Assumes all type applications have been resolved by typeApplicationResolution first export class ConstraintGeneratorVisitor implements IRVisitor { // Inject dependency to allow manipulation in unit tests constructor(solvingFunction: SolvingFunctionType, table: LookupTable, types?: Map) { @@ -93,23 +95,23 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } } - protected types: Map = new Map() + protected types: Map = new Map() protected errors: Map = new Map() + protected freshVarGenerator: FreshVarGenerator + protected table: LookupTable - private solvingFunction: SolvingFunctionType private constraints: Constraint[] = [] - + private solvingFunction: SolvingFunctionType private builtinSignatures: Map = getSignatures() - private table: LookupTable - private freshVarGenerator: FreshVarGenerator + + // A map to save which type variables were free when we started visiting an opdef or an assume + protected tvs: Map = new Map() + // Temporary type map only for types in scope for a certain declaration + protected typesInScope: Map = new Map() // Track location descriptions for error tree traces private location: string = '' - // A stack of free type variables and row variables for lambda expressions. - // Nested lambdas add new entries to the stack, and pop them when exiting. - private freeNames: { typeVariables: Set; rowVariables: Set }[] = [] - getResult(): [Map, Map] { return [this.errors, this.types] } @@ -118,20 +120,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { this.location = `Generating constraints for ${expressionToString(e)}` } - exitDef(def: QuintDef) { - if (this.constraints.length > 0) { - this.solveConstraints().map(subs => { - if (!isAnnotatedDef(def)) { - return - } - - checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => - this.errors.set(def.typeAnnotation?.id ?? def.id, err) - ) - }) - } - } - exitVar(e: QuintVar) { this.addToResults(e.id, right(toScheme(e.typeAnnotation))) } @@ -193,7 +181,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { ) // We want `definedSignature` computed before the fresh variable `a` so that the - // numbering of ther fresh variables stays in order, with `a`, used for return types, + // numbering of their fresh variables stays in order, with `a`, used for return types, // bearing the highest number. const definedSignature = this.typeForName(e.opcode, e.id, e.args.length) const a: QuintType = { kind: 'var', name: this.freshVarGenerator.freshVar('_t') } @@ -215,9 +203,7 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return validateArity(e.opcode, results, l => l === 3, '3').chain(() => withConstraints(e.id, results, a)) // Tuple operators case 'Tup': - return validateArity(e.opcode, results, l => l > 0, 'at least one').chain(() => - tupleConstructorConstraints(e.id, results, a) - ) + return tupleConstructorConstraints(e.id, results, a) case 'item': return validateArity(e.opcode, results, l => l === 2, '2').chain(() => itemConstraints(e.id, results, a)) // Sum type operators @@ -245,18 +231,14 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } enterLambda(expr: QuintLambda) { - const lastParamNames = this.currentFreeNames() - const paramNames = { - typeVariables: new Set(lastParamNames.typeVariables), - rowVariables: new Set(lastParamNames.rowVariables), - } expr.params.forEach(p => { const varName = p.name === '_' ? this.freshVarGenerator.freshVar('_t') : `t_${p.name}_${p.id}` - paramNames.typeVariables.add(varName) - this.addToResults(p.id, right(toScheme({ kind: 'var', name: varName }))) + const paramTypeVar: QuintVarType = { kind: 'var', name: varName } + this.addToResults(p.id, right(toScheme(paramTypeVar))) + if (p.typeAnnotation) { + this.constraints.push({ kind: 'eq', types: [paramTypeVar, p.typeAnnotation], sourceId: p.id }) + } }) - - this.freeNames.push(paramNames) } // Γ ∪ {p0: t0, ..., pn: tn} ⊢ e: (te, c) t0, ..., tn are fresh @@ -280,7 +262,6 @@ export class ConstraintGeneratorVisitor implements IRVisitor { }) this.addToResults(e.id, result) - this.freeNames.pop() } // Γ ⊢ e1: (t1, c1) s = solve(c1) s(Γ ∪ {n: t1}) ⊢ e2: (t2, c2) @@ -291,22 +272,58 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return } - // TODO: Occurs check on operator body to prevent recursion, see https://github.com/informalsystems/quint/issues/171 - this.addToResults(e.id, this.fetchResult(e.expr.id)) } - exitOpDef(e: QuintOpDef) { + exitDecl(_def: QuintDeclaration) { + this.typesInScope = new Map() + } + + enterOpDef(def: QuintOpDef) { + // Save which type variables were free when we started visiting this op def + const tvs = this.freeNamesInScope() + this.tvs.set(def.id, tvs) + } + + exitOpDef(def: QuintOpDef) { if (this.errors.size !== 0) { return } - this.fetchResult(e.expr.id).map(t => { - this.addToResults(e.id, right(this.quantify(t.type))) - if (e.typeAnnotation) { - this.constraints.push({ kind: 'eq', types: [t.type, e.typeAnnotation], sourceId: e.id }) + this.fetchResult(def.expr.id).map(t => { + if (def.typeAnnotation) { + this.constraints.push({ kind: 'eq', types: [t.type, def.typeAnnotation], sourceId: def.id }) } }) + + const tvs_before = this.tvs.get(def.id)! + + if (this.constraints.length > 0) { + this.solveConstraints().map(subs => { + // For every free name we are binding in the substitutions, the names occuring in the value of the substitution + // have to become free as well. + addBindingsToFreeTypes(tvs_before, subs) + + if (isAnnotatedDef(def)) { + checkAnnotationGenerality(subs, def.typeAnnotation).mapLeft(err => + this.errors.set(def.typeAnnotation?.id ?? def.id, err) + ) + } + }) + } + + const tvs = this.freeNamesInScope() + // Any new free names, that were not free before, have to be quantified + const toQuantify = variablesDifference(tvs, tvs_before) + + this.fetchResult(def.expr.id).map(t => { + this.addToResults(def.id, right(quantify(toQuantify, t.type))) + }) + } + + enterAssume(e: QuintAssume) { + const tvs = this.freeNamesInScope() + this.tvs.set(e.id, tvs) } exitAssume(e: QuintAssume) { @@ -315,7 +332,10 @@ export class ConstraintGeneratorVisitor implements IRVisitor { } this.fetchResult(e.assumption.id).map(t => { - this.addToResults(e.id, right(this.quantify(t.type))) + const tvs_before = this.tvs.get(e.id)! + const tvs = this.freeNamesInScope() + const toQuantify = variablesDifference(tvs, tvs_before) + this.addToResults(e.id, right(quantify(toQuantify, t.type))) this.constraints.push({ kind: 'eq', types: [t.type, { kind: 'bool' }], sourceId: e.id }) }) } @@ -323,7 +343,10 @@ export class ConstraintGeneratorVisitor implements IRVisitor { private addToResults(exprId: bigint, result: Either) { result .mapLeft(err => this.errors.set(exprId, buildErrorTree(this.location, err))) - .map(r => this.types.set(exprId, r)) + .map(r => { + this.typesInScope.set(exprId, r) + this.types.set(exprId, r) + }) } private fetchResult(id: bigint): Either { @@ -347,20 +370,11 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return this.solvingFunction(this.table, constraint) .mapLeft(errors => errors.forEach((err, id) => this.errors.set(id, err))) .map(subs => { - // For every free name we are binding in the substitutions, the names occuring in the value of the substitution - // have to become free as well. - this.addBindingsToFreeNames(subs) - - // Apply substitution to environment - // FIXME: We have to figure out the scope of the constraints/substitutions - // https://github.com/informalsystems/quint/issues/690 - this.types = new Map( - [...this.types.entries()].map(([id, te]) => { - const newType = applySubstitution(this.table, subs, te.type) - const scheme: TypeScheme = this.quantify(newType) - return [id, scheme] - }) - ) + this.typesInScope.forEach((oldScheme, id) => { + const newType = applySubstitution(this.table, subs, oldScheme.type) + const newScheme: TypeScheme = { ...oldScheme, type: newType } + this.addToResults(id, right(newScheme)) + }) return subs }) @@ -407,45 +421,18 @@ export class ConstraintGeneratorVisitor implements IRVisitor { return applySubstitution(this.table, subs, t.type) } - private currentFreeNames(): { typeVariables: Set; rowVariables: Set } { - return ( - this.freeNames[this.freeNames.length - 1] ?? { - typeVariables: new Set(), - rowVariables: new Set(), - } + private freeNamesInScope(): QuantifiedVariables { + return [...this.typesInScope.values()].reduce( + (acc, t) => { + const names = freeTypes(t) + return { + typeVariables: new Set([...names.typeVariables, ...acc.typeVariables]), + rowVariables: new Set([...names.rowVariables, ...acc.rowVariables]), + } + }, + { typeVariables: new Set(), rowVariables: new Set() } ) } - - private quantify(type: QuintType): TypeScheme { - const freeNames = this.currentFreeNames() - const nonFreeNames = { - typeVariables: new Set([...typeNames(type).typeVariables].filter(name => !freeNames.typeVariables.has(name))), - rowVariables: new Set([...typeNames(type).rowVariables].filter(name => !freeNames.rowVariables.has(name))), - } - return { ...nonFreeNames, type } - } - - private addBindingsToFreeNames(substitutions: Substitutions) { - // Assumes substitutions are topologically sorted, i.e. [ t0 |-> (t1, t2), t1 |-> (t3, t4) ] - substitutions.forEach(s => { - switch (s.kind) { - case 'type': - this.freeNames - .filter(free => free.typeVariables.has(s.name)) - .forEach(free => { - const names = typeNames(s.value) - names.typeVariables.forEach(v => free.typeVariables.add(v)) - names.rowVariables.forEach(v => free.rowVariables.add(v)) - }) - return - case 'row': - this.freeNames - .filter(free => free.rowVariables.has(s.name)) - .forEach(free => rowNames(s.value).forEach(v => free.rowVariables.add(v))) - return - } - }) - } } function checkAnnotationGenerality( @@ -456,10 +443,13 @@ function checkAnnotationGenerality( return right(subs) } - // Look for type/row variables in the annotation that are bound by `subs` + // Find type and row variables in the annotation that are bound to non-variable types in the substitutions. + // This indicates that they are inferred to have a concrete type. const names = typeNames(typeAnnotation) - const tooGeneralTypes = subs.filter(s => s.kind === 'type' && names.typeVariables.has(s.name)) - const tooGeneralRows = subs.filter(s => s.kind === 'row' && names.rowVariables.has(s.name)) + const tooGeneralTypes = subs.filter( + s => s.kind === 'type' && s.value.kind !== 'var' && names.typeVariables.has(s.name) + ) + const tooGeneralRows = subs.filter(s => s.kind === 'row' && s.value.kind !== 'var' && names.rowVariables.has(s.name)) const errors = [...tooGeneralTypes, ...tooGeneralRows].map(s => { const expected = s.kind === 'type' ? typeToString(s.value) : rowToString(s.value) @@ -475,3 +465,39 @@ function checkAnnotationGenerality( return right(subs) } } + +function quantify(tvs: QuantifiedVariables, type: QuintType): TypeScheme { + return { ...tvs, type } +} + +function freeTypes(t: TypeScheme): QuantifiedVariables { + const allNames = typeNames(t.type) + return variablesDifference(allNames, { typeVariables: t.typeVariables, rowVariables: t.rowVariables }) +} + +function addBindingsToFreeTypes(free: QuantifiedVariables, substitutions: Substitutions): void { + // Assumes substitutions are topologically sorted, i.e. [ t0 |-> (t1, t2), t1 |-> (t3, t4) ] + substitutions.forEach(s => { + switch (s.kind) { + case 'type': + if (free.typeVariables.has(s.name)) { + const names = typeNames(s.value) + names.typeVariables.forEach(v => free.typeVariables.add(v)) + names.rowVariables.forEach(v => free.rowVariables.add(v)) + } + return + case 'row': + if (free.rowVariables.has(s.name)) { + rowNames(s.value).forEach(v => free.rowVariables.add(v)) + } + return + } + }) +} + +function variablesDifference(a: QuantifiedVariables, b: QuantifiedVariables): QuantifiedVariables { + return { + typeVariables: new Set([...a.typeVariables].filter(tv => !b.typeVariables.has(tv))), + rowVariables: new Set([...a.rowVariables].filter(tv => !b.rowVariables.has(tv))), + } +} diff --git a/quint/src/types/constraintSolver.ts b/quint/src/types/constraintSolver.ts index 9e4258f07..d2da613b3 100644 --- a/quint/src/types/constraintSolver.ts +++ b/quint/src/types/constraintSolver.ts @@ -16,7 +16,7 @@ import { Either, left, right } from '@sweet-monads/either' import { Error, ErrorTree, buildErrorLeaf, buildErrorTree } from '../errorTree' import { rowToString, typeToString } from '../ir/IRprinting' import { QuintConstType, QuintType, Row, rowNames, typeNames } from '../ir/quintTypes' -import { Constraint } from './base' +import { Constraint, compareConstraints } from './base' import { Substitutions, applySubstitution, applySubstitutionToConstraint, compose } from './substitutions' import { unzip } from 'lodash' import { LookupTable } from '../names/base' @@ -38,6 +38,8 @@ export function solveConstraint( ): Either, Substitutions> { const errors: Map = new Map() switch (constraint.kind) { + case 'empty': + return right([]) case 'eq': return unify(table, constraint.types[0], constraint.types[1]).mapLeft(e => { errors.set(constraint.sourceId, e) @@ -45,20 +47,22 @@ export function solveConstraint( }) case 'conjunction': { // Chain solving of inner constraints, collecting all errors (even after the first failure) - return constraint.constraints.reduce((result: Either, Substitutions>, con) => { - // If previous result is a failure, try to solve the original constraint - // to gather all errors instead of just propagating the first one - let newCons = con - result.map(s => { - newCons = applySubstitutionToConstraint(table, s, con) - }) - return solveConstraint(table, newCons) - .mapLeft(e => { - e.forEach((error, id) => errors.set(id, error)) - return errors + return constraint.constraints + .sort(compareConstraints) + .reduce((result: Either, Substitutions>, con) => { + // If previous result is a failure, try to solve the original constraint + // to gather all errors instead of just propagating the first one + let newCons = con + result.map(s => { + newCons = applySubstitutionToConstraint(table, s, con) }) - .chain(newSubs => result.map(s => compose(table, newSubs, s))) - }, right([])) + return solveConstraint(table, newCons) + .mapLeft(e => { + e.forEach((error, id) => errors.set(id, error)) + return errors + }) + .chain(newSubs => result.map(s => compose(table, newSubs, s))) + }, right([])) } case 'isDefined': { for (const def of table.values()) { @@ -66,7 +70,6 @@ export function solveConstraint( const subst = unify(table, def.type, constraint.type) if (subst.isRight()) { // We found a defined type unifying with the given schema - // (unwrap the vaule since the left of `unify` doesn't match our needs and isn't relevent) return right(subst.unwrap()) } } @@ -80,8 +83,6 @@ export function solveConstraint( ) return left(errors) } - case 'empty': - return right([]) } } diff --git a/quint/src/types/inferrer.ts b/quint/src/types/inferrer.ts index 8889765e8..517101054 100644 --- a/quint/src/types/inferrer.ts +++ b/quint/src/types/inferrer.ts @@ -30,14 +30,16 @@ export class TypeInferrer extends ConstraintGeneratorVisitor { } /** - * Infers an type for each expression in a list of QuintDeclarations + * Infers a type for each expression in a list of QuintDeclarations. If there + * are missing types in the type map, there will be at least one error. * * @param declarations: the list of QuintDeclarations to infer types for * - * @returns a map from expression ids to their types and a map from expression + * @returns a map from expression ids to their type schemes and a map from expression * ids to the corresponding error for any problematic expressions. */ inferTypes(declarations: QuintDeclaration[]): TypeInferenceResult { + // Resolve all type applications used in expressions in the lookup table declarations.forEach(decl => { walkDeclaration(this, decl) }) diff --git a/quint/src/types/substitutions.ts b/quint/src/types/substitutions.ts index 49fbe496e..1e426b1dc 100644 --- a/quint/src/types/substitutions.ts +++ b/quint/src/types/substitutions.ts @@ -97,8 +97,13 @@ export function applySubstitution(table: LookupTable, subs: Substitutions, t: Qu // start as one, and applying substitions cannot result in a wider type fields: applySubstitutionToRow(table, subs, t.fields) as ConcreteFixedRow, } + case 'app': + return { + ...t, + args: t.args.map(a => applySubstitution(table, subs, a)), + } - // The basic types have no variables, so cannot + // The basic types have no variables, so don't require substitution case 'int': case 'bool': case 'str': diff --git a/quint/src/types/typeApplicationResolution.ts b/quint/src/types/typeApplicationResolution.ts new file mode 100644 index 000000000..7dd83d45e --- /dev/null +++ b/quint/src/types/typeApplicationResolution.ts @@ -0,0 +1,184 @@ +/* ---------------------------------------------------------------------------------- + * Copyright 2024 Informal Systems + * Licensed under the Apache License, Version 2.0. + * See LICENSE in the project root for license information. + * --------------------------------------------------------------------------------- */ + +/** + * Resolution of type application + * + * @author Shon Feder + * + * @module + */ + +import { ErrorTree, buildErrorLeaf } from '../errorTree' +import { FreshVarGenerator } from '../FreshVarGenerator' + +import { typeToString } from '../ir/IRprinting' +import { IRTransformer, transformDeclaration, transformLookupDefinition, transformType } from '../ir/IRTransformer' +import { QuintDeclaration, QuintTypeAlias } from '../ir/quintIr' +import { QuintAppType, QuintType, QuintVarType, Row } from '../ir/quintTypes' +import { LookupTable } from '../names/base' +import { zip } from '../util' +import { Substitutions, applySubstitution } from './substitutions' +import assert from 'assert' + +/** Resolves all type applications in an IR object */ +export class TypeApplicationResolver implements IRTransformer { + // Errors found during type application resolution + private errors: Map = new Map() + // Fresh variable generator, shared with the TypeInferrer + private freshVarGenerator: FreshVarGenerator + // Lookup table from the parser + private table: LookupTable + + constructor(table: LookupTable) { + this.table = table + this.freshVarGenerator = new FreshVarGenerator() + + this.table.forEach((def, id) => { + const resolvedLookupDef = transformLookupDefinition(this, def) + this.table.set(id, resolvedLookupDef) + }) + } + + resolveTypeApplications(decls: QuintDeclaration[]): [Map, QuintDeclaration[]] { + const resolvedDecls = decls.map(decl => transformDeclaration(this, decl)) + const errors = this.errors + return [errors, resolvedDecls] + } + + exitType(t: QuintType): QuintType { + return this.resolveTypeApplicationsForType(t) + } + + // Transforms `t` by resolving all the type applications in all its sub-terms + // + // E.g., given + // + // type Foo[a, b] = (a, b) + // type Bar[x, y] = {i: x, j: y} + // + // + // resolveTypeApplicationsForType(Foo[a, {f: Bar[int, str]}]) = (a, {f: {i: int, j: str}}) + private resolveTypeApplicationsForType(t: QuintType): QuintType { + const f: (_: QuintType) => QuintType = x => (x.kind !== 'app' ? x : this.resolveTypeApp(x)) + return mapType(f, t) + } + + private resolveTypeApp(t: QuintAppType): QuintType { + // Ensured by parsing + assert(t.id, `invalid IR node: type application ${typeToString(t)} has no id`) + // Ensured by parsing + assert( + t.ctor.id, + `invalid IR node: type constructor ${t.ctor.name} in type application ${typeToString(t)} id ${t.id} has no id` + ) + + const typeDef = this.table.get(t.ctor.id) + // Ensured by name resolution + assert(typeDef, `invalid IR reference: type constructor ${t.ctor.name} with id ${t.ctor.id} has no type definition`) + // Ensured by the grammar and by name resolution + assert( + typeDef.kind === 'typedef' && typeDef.type, + `invalid kind looked up for constructor of type application with id ${t.ctor.id} ` + ) + + const { params, type } = this.freshTypeFromDef(typeDef as QuintTypeAlias) + + // NOTE: Early exit on error + // Check for arity mismatch in type application + if (params.length !== t.args.length) { + const ctorMsg = typeToString(t.ctor) + const typeArgsMsg = t.args.map(typeToString).join(', ') + const manyOrFew = params.length > t.args.length ? 'few' : 'many' + const err = buildErrorLeaf( + `applying type constructor ${ctorMsg} to arguments ${typeArgsMsg}`, + `too ${manyOrFew} arguments supplied: ${ctorMsg} only accepts ${params.length} parameters` + ) + this.errors.set(t.id, err) + return t + } + + // Substitute the type `args` for each corresponding fresh variable + const subs: Substitutions = zip(params, t.args).map(([param, arg]) => ({ + kind: 'type', + name: param.name, + value: arg, + })) + return applySubstitution(this.table, subs, type) + } + + // Given a type definition, extract the type it is defined by (with all type + // parameters replaced with fresh variables) and a list of params giving the + // fresh type variables in the order corresponding to the params they + // replaced in the type declaration. + // + // E.g., the type definition + // + // type Result[ok, err] = Ok(ok) | Err(err) + // + // Will produce the result + // + // { params: [fresh_ok, fresh_err], + // type: (Ok(fresh_ok) | Err(fresh_err)) + // } + private freshTypeFromDef(typeDef: QuintTypeAlias): { params: QuintVarType[]; type: QuintType } { + if (!typeDef.params || typeDef.params.length === 0) { + return { params: [], type: typeDef.type } + } + + // Coordinates parameter names with their corresponding fresh variables + const varsMap: Map = new Map( + typeDef.params.map(param => [param, this.freshVarGenerator.freshVar(param)]) + ) + + // Parsing guarantees that every variable in a type def is in the params + const type = mapTypeVarNames(n => varsMap.get(n) ?? n, typeDef.type) + const freshParamNames = [...varsMap.values()] + const params: QuintVarType[] = freshParamNames.map(name => ({ kind: 'var', name })) + + return { type, params } + } +} + +// Map type variable names according to `f` +function mapTypeVarNames(f: (_: string) => string, t: QuintType): QuintType { + const transformer = new TypeVariableNameMapper(f) + return transformType(transformer, t) +} + +class TypeVariableNameMapper implements IRTransformer { + private mapper: (_: string) => string + + constructor(f: (_: string) => string) { + this.mapper = f + } + + exitVarType(t: QuintVarType): QuintVarType { + return { ...t, name: this.mapper(t.name) } + } + + exitRow(r: Row): Row { + return r.kind === 'var' ? { ...r, name: this.mapper(r.name) } : r + } +} + +// Transform `t`, and all its subterms, by `f` +function mapType(f: (_: QuintType) => QuintType, t: QuintType): QuintType { + const transformer = new TypeMapper(f) + return transformType(transformer, t) +} + +class TypeMapper implements IRTransformer { + private mapper: (_: QuintType) => QuintType + + constructor(f: (_: QuintType) => QuintType) { + this.mapper = f + } + + exitType(t: QuintType): QuintType { + return this.mapper(t) + } +} diff --git a/quint/src/version.ts b/quint/src/version.ts index c65c1066d..25e1ed200 100644 --- a/quint/src/version.ts +++ b/quint/src/version.ts @@ -1,2 +1,2 @@ // Generated by genversion. -export const version = '0.16.0' +export const version = '0.19.4' diff --git a/quint/test/effects/NondetChecker.test.ts b/quint/test/effects/NondetChecker.test.ts new file mode 100644 index 000000000..6499bdc95 --- /dev/null +++ b/quint/test/effects/NondetChecker.test.ts @@ -0,0 +1,132 @@ +import { describe, it } from 'mocha' +import { assert } from 'chai' +import { errorTreeToString, newIdGenerator, parse, quintErrorToString } from '../../src' +import { NondetChecker } from '../../src/effects/NondetChecker' +import { SourceLookupPath } from '../../src/parsing/sourceResolver' +import { TypeInferrer } from '../../src/types/inferrer' + +describe('checkNondets', () => { + function parseAndTypecheck(text: string) { + const idGen = newIdGenerator() + const fake_path: SourceLookupPath = { normalizedPath: 'fake_path', toSourceName: () => 'fake_path' } + const { modules, table, errors } = parse(idGen, 'fake_location', fake_path, text) + assert.isEmpty(errors, `Unexpected parse errors: ${[...errors].map(quintErrorToString)}`) + + const typeInferrer = new TypeInferrer(table) + const [typeErrors, types] = typeInferrer.inferTypes(modules[0].declarations) + assert.isEmpty(typeErrors, `Unexpected type errors: ${[...typeErrors.values()].map(errorTreeToString)}`) + + return { module: modules[0], table, types } + } + + it('returns empty map for effects with no problems', () => { + const text = `module A { + val a = 1 + var x: int + action foo = { nondet bar = Set(1,2).oneOf() x' = bar } + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) + }) + + it('finds an error when oneOf is used in a val', () => { + const text = `module A { + val a = Set(1,2).oneOf() + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ + { code: 'QNT203', message: "'oneOf' must be used inside a nondet definition", reference: 4n, data: {} }, + ]) + }) + + it('finds an error when oneOf is not the outtermost expression', () => { + const text = `module A { + var x: int + + action foo = { nondet bar = Set(1,2).oneOf() + 1 { x' = bar } } + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ + { + code: 'QNT204', + message: "'oneOf' must be the outermost expression in a nondet definition", + reference: 8n, + data: {}, + }, + ]) + }) + + it('find an error when nondet is a top-level definition', () => { + const text = `module A { + var x: int + + nondet top_level = Set(1,2).oneOf() + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ + { + code: 'QNT206', + message: "'nondet' can only be used inside actions, not at the top level", + reference: 7n, + data: {}, + }, + ]) + }) + + it('finds an error when the scope expression for the nondet binding is not boolean', () => { + // FIXME: ideally this should also complain about the top-level def not + // being an action. This requires the introduction of a new effect, which is + // not trivial. For now, checking for boolean returns should already help a + // lot. + const text = `module A { + // error: nondet bindings can only be used with boolean expressions + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module, table, types } = parseAndTypecheck(text) + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, [ + { + code: 'QNT205', + message: 'nondet bindings can only be used with boolean expressions, but expression has type: int', + reference: 7n, + data: {}, + }, + ]) + }) + + it('can survive missing types and lookup table entries', () => { + const text = `module A { + var x: int + + nondet top_level = Set(1,2).oneOf() + val non_action = { nondet bar = Set(1,2).oneOf() bar } + }` + + const { module } = parseAndTypecheck(text) + const table = new Map() + const types = new Map() + + const errors = new NondetChecker(table).checkNondets(types, module.declarations) + + assert.sameDeepMembers(errors, []) + }) +}) diff --git a/quint/test/effects/base.test.ts b/quint/test/effects/base.test.ts index 0176016d4..d17ec5164 100644 --- a/quint/test/effects/base.test.ts +++ b/quint/test/effects/base.test.ts @@ -375,48 +375,39 @@ describe('unify', () => { assert.isTrue(result.isLeft()) }) - it('returs error when entity names are cyclical', () => { - const e1 = parseEffectOrThrow('Read[v1]') - const e2 = parseEffectOrThrow('Read[v1, v2]') - - const result = unify(e1, e2) - - result.mapLeft(e => - assert.deepEqual(e, { - location: 'Trying to unify Read[v1] and Read[v1, v2]', - children: [ - { - location: 'Trying to unify entities [v1] and [v1, v2]', - message: "Can't bind v1 to v1, v2: cyclical binding", - children: [], - }, - ], - }) - ) - - assert.isTrue(result.isLeft()) - }) - - it('returs error when entity names are cyclical in other way', () => { - const e1 = parseEffectOrThrow('Temporal[v1, v2]') - const e2 = parseEffectOrThrow('Temporal[v1]') - - const result = unify(e1, e2) - - result.mapLeft(e => - assert.deepEqual(e, { - location: 'Trying to unify Temporal[v1, v2] and Temporal[v1]', - children: [ - { - location: 'Trying to unify entities [v1, v2] and [v1]', - message: "Can't bind v1 to v1, v2: cyclical binding", - children: [], - }, - ], - }) - ) - - assert.isTrue(result.isLeft()) + it('can unify entities when a single variable in the lhs appears in a union on the rhs', () => { + // E.g., given the unification problem + // + // v1 =.= v1 ∪ v2 + // + // We should be able to form a valid substitution iff v1 =.= v2, since + // this then simplifies to + // + // v1 =.= v1 =.= v2 + // + // NOTE: This test was inverted after an incorrect occurs check was + // causing erroneous effect checking failures, as reported in + // https://github.com/informalsystems/quint/issues/1356 + // + // Occurs checks are called for to prevent the attempt to unify a free + // variable with a term that includes that variable as a subterm. E.g., `X + // =.= foo(a, X)`, which can never be resolved into a ground term. + // However, despite appearances, the unification of so called "entity + // unions", as in the example above is not such a case. Each "entity + // variable" stands for a set of possible state variables. As such, the + // unification problem above can be expanded to + // + // v1 ∪ {} =.= v1 ∪ v2 ∪ {} + // + // Which helps make clear why the unification succeeds iff v1 =.= v2. + const read1 = parseEffectOrThrow('Read[v1]') + const read2 = parseEffectOrThrow('Read[v1, v2]') + assert.isTrue(unify(read1, read2).isRight()) + + // Check the symmetrical case. + const temporal1 = parseEffectOrThrow('Temporal[v1, v2]') + const temporal2 = parseEffectOrThrow('Temporal[v1]') + assert.isTrue(unify(temporal1, temporal2).isRight()) }) }) }) diff --git a/quint/test/effects/inferrer.test.ts b/quint/test/effects/inferrer.test.ts index cba870e1d..25afaf776 100644 --- a/quint/test/effects/inferrer.test.ts +++ b/quint/test/effects/inferrer.test.ts @@ -207,6 +207,19 @@ describe('inferEffects', () => { assert.deepEqual(effectForDef(defs, effects, 'CoolAction'), expectedEffect) }) + it('avoids invalid cyclical binding error (regression on #1356)', () => { + const defs = [ + `pure def foo(s: int, g: int => int): int = { + val r = if (true) s else g(s) + g(r) + }`, + ] + + const [errors, _] = inferEffectsForDefs(defs) + + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) + }) + it('returns error when operator signature is not unifiable with args', () => { const defs = [`def a = S.map(p => x' = p)`] @@ -266,4 +279,28 @@ describe('inferEffects', () => { message: 'Expected [x] and [] to be the same', }) }) + + it('differentiates variables from different instances', () => { + const baseDefs = ['const N: int', 'const S: Set[int]', 'var x: int'] + + const text = ` + module base { ${baseDefs.join('\n')} } + module wrapper { + import base(N=1) as B1 + import base(N=2) as B2 + val a = B1::x + B2::x + }` + const { modules, table } = parseMockedModule(text) + + const inferrer = new EffectInferrer(table) + inferrer.inferEffects(modules[0].declarations) + const [errors, effects] = inferrer.inferEffects(modules[1].declarations) + assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) + + const def = modules[1].declarations.find(decl => isDef(decl) && decl.name === 'a')! + + const expectedEffect = "Read['wrapper::B1::x', 'wrapper::B2::x']" + + assert.deepEqual(effectSchemeToString(effects.get(def.id)!), expectedEffect) + }) }) diff --git a/quint/test/effects/modeChecker.test.ts b/quint/test/effects/modeChecker.test.ts index 750f7085f..365a0d7a9 100644 --- a/quint/test/effects/modeChecker.test.ts +++ b/quint/test/effects/modeChecker.test.ts @@ -34,12 +34,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: "def operators may only read state variables, but operator `a` updates variables 'x'. Use action instead.", code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'def', replacement: 'action' } }, }, ], @@ -71,7 +71,7 @@ describe('checkModes', () => { const [errors, suggestions] = checkMockedDefs(defs) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) - assert.sameDeepMembers([...suggestions.entries()], [[12n, 'def']]) + assert.sameDeepMembers([...suggestions.entries()], [[13n, 'def']]) }) it('finds mode errors between pureval and val', () => { @@ -114,12 +114,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 11n, + 12n, { message: "pure def operators may not interact with state variables, but operator `f` reads variables 'y'. Use def instead.", code: 'QNT200', - reference: 11n, + reference: 12n, data: { fix: { kind: 'replace', original: 'pure def', replacement: 'def' } }, }, ], @@ -133,7 +133,7 @@ describe('checkModes', () => { const [errors, suggestions] = checkMockedDefs(defs) assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(quintErrorToString)}`) - assert.sameDeepMembers([...suggestions.entries()], [[10n, 'puredef']]) + assert.sameDeepMembers([...suggestions.entries()], [[11n, 'puredef']]) }) it('finds mode errors between val and temporal', () => { @@ -245,12 +245,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: 'pure val operators may not have parameters, but operator `foo` has 1 parameter. Use pure def instead.', code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'pure val', replacement: 'pure def' } }, }, ], @@ -267,11 +267,11 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: 'val operators may not have parameters, but operator `foo` has 1 parameter. Use def instead.', code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'val', replacement: 'def' } }, }, ], @@ -288,12 +288,12 @@ describe('checkModes', () => { [...errors.entries()], [ [ - 12n, + 13n, { message: "pure val operators may not interact with state variables, but operator `foo` reads variables 'x'. Use def instead.", code: 'QNT200', - reference: 12n, + reference: 13n, data: { fix: { kind: 'replace', original: 'pure val', replacement: 'def' } }, }, ], diff --git a/quint/test/effects/namespaces.test.ts b/quint/test/effects/namespaces.test.ts new file mode 100644 index 000000000..5bb508fc0 --- /dev/null +++ b/quint/test/effects/namespaces.test.ts @@ -0,0 +1,16 @@ +import { describe, it } from 'mocha' +import { assert } from 'chai' +import { effectToString } from '../../src/effects/printing' +import { parseEffectOrThrow } from '../../src/effects/parser' +import { addNamespaces } from '../../src/effects/namespaces' + +describe('addNamespace', () => { + it('adds namespaces to state variable names', () => { + const namespaces = ['Second', 'First'] + const effect = parseEffectOrThrow("Read['x'] & Update[e0, 'y']") + + const result = addNamespaces(effect, namespaces) + + assert.deepEqual(effectToString(result), "Read['First::Second::x'] & Update[e0, 'First::Second::y']") + }) +}) diff --git a/quint/test/flattening/fullFlattener.test.ts b/quint/test/flattening/fullFlattener.test.ts index f55422999..6dc0c8c39 100644 --- a/quint/test/flattening/fullFlattener.test.ts +++ b/quint/test/flattening/fullFlattener.test.ts @@ -235,4 +235,19 @@ describe('flattenModules', () => { assertFlattenedModule(text) }) + + // Regression test for https://github.com/informalsystems/quint/issues/1391 + describe('can flatten with polymorphic types between different modules (#802)', () => { + const text = `module A { + type Foo[a] = F(a) + def mapFoo(x: Foo[a], f: a => b): Foo[b] = match x { F(v) => F(f(v)) } + } + + module B { + import A.* + val b: Foo[int] = F("one").mapFoo(_ => 1) + }` + + assertFlattenedModule(text) + }) }) diff --git a/quint/test/ir/IRFinder.test.ts b/quint/test/ir/IRFinder.test.ts index e62a76d3d..312e3077c 100644 --- a/quint/test/ir/IRFinder.test.ts +++ b/quint/test/ir/IRFinder.test.ts @@ -64,12 +64,15 @@ describe('findParameterWithId', () => { const modules = [buildModuleWithDecls(['pure def x(a: int): int = a'])] it('finds definition for existing id', () => { - const def = findParameterWithId(modules, 1n) - + const def = findParameterWithId(modules, 2n) assert.isDefined(def) assert.deepEqual(def, { - id: 1n, + id: 2n, name: 'a', + typeAnnotation: { + id: 1n, + kind: 'int', + }, }) }) diff --git a/quint/test/ir/IRTransformer.test.ts b/quint/test/ir/IRTransformer.test.ts index c01ce0d51..70b210cbc 100644 --- a/quint/test/ir/IRTransformer.test.ts +++ b/quint/test/ir/IRTransformer.test.ts @@ -41,6 +41,26 @@ describe('enterExpr', () => { assert.deepEqual(moduleToString(result), moduleToString(expectedModule)) }) + + it('transforms paramater type annotations', () => { + class TestTransformer implements IRTransformer { + exitType(_: QuintType): QuintType { + return { kind: 'var', name: 'trans' } + } + } + + const transformer = new TestTransformer() + + const m = buildModuleWithDecls(['def foo(x: int, b: int, c: str): int = 42']) + + const transformedDecl = transformModule(transformer, m).declarations[0] + assert(transformedDecl.kind === 'def') + assert(transformedDecl.expr.kind === 'lambda') + transformedDecl.expr.params.forEach(p => { + assert(p.typeAnnotation) + assert.deepEqual(p.typeAnnotation, { kind: 'var', name: 'trans' }) + }) + }) }) describe('enterDecl', () => { diff --git a/quint/test/ir/IRVisitor.test.ts b/quint/test/ir/IRVisitor.test.ts index 290fc921f..34b024d5b 100644 --- a/quint/test/ir/IRVisitor.test.ts +++ b/quint/test/ir/IRVisitor.test.ts @@ -855,5 +855,48 @@ describe('walkModule', () => { assert.deepEqual(visitor.entered.map(typeToString), enteredTypes) assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) }) + + it('finds type applications', () => { + const quintModule = buildModuleWithDecls(['val strMap: StrMap[int] = Map("a" -> 1, "b" -> 2)']) + class TestVisitor implements IRVisitor { + entered: QuintType[] = [] + exited: QuintType[] = [] + + enterAppType(type: QuintType): void { + this.entered.push(type) + } + + exitAppType(type: QuintType): void { + this.exited.push(type) + } + } + + const expectedTypes = ['StrMap[int]'] + + const visitor = new TestVisitor() + walkModule(visitor, quintModule) + assert.deepEqual(visitor.entered.map(typeToString), expectedTypes) + assert.deepEqual(visitor.exited.map(typeToString), expectedTypes) + }) + + it('finds paramater type annotations', () => { + class TestVisitor implements IRVisitor { + typesVisited: QuintType[] = [] + exitType(t: QuintType) { + this.typesVisited.push(t) + } + } + + const visitor = new TestVisitor() + + const m = buildModuleWithDecls(['def foo(x: int, b: str): bool = true']) + walkModule(visitor, m) + const actualTypes = visitor.typesVisited.map(typeToString) + // `int` and `str` should each show up TWICE: + // - once from of the lambda type annotations + // - once from of the parameter type annotation + const expectedTypes = ['int', 'str', 'bool', '(int, str) => bool', 'int', 'str'] + assert.deepEqual(actualTypes, expectedTypes) + }) }) }) diff --git a/quint/test/ir/IRprinting.test.ts b/quint/test/ir/IRprinting.test.ts index dc8df1eb0..f5035f22c 100644 --- a/quint/test/ir/IRprinting.test.ts +++ b/quint/test/ir/IRprinting.test.ts @@ -249,4 +249,10 @@ describe('typeToString', () => { const expectedType = '(A(int) | B)' assert.deepEqual(typeToString(type), expectedType) }) + + it('pretty prints type applications', () => { + const input = 'Result[ok, err]' + const type = buildType(input) + assert.deepEqual(typeToString(type), input) + }) }) diff --git a/quint/test/itf.test.ts b/quint/test/itf.test.ts index 1f1a622f2..03d490211 100644 --- a/quint/test/itf.test.ts +++ b/quint/test/itf.test.ts @@ -47,6 +47,7 @@ describe('toItf', () => { g: Map(1 -> "a", 2 -> "b", 3 -> "c"), h: Map(), i: Map(1 -> "a"), + j: variant("A", 2) } ` const trace = [buildExpression(text)] @@ -74,6 +75,7 @@ describe('toItf', () => { }, h: { '#map': [] }, i: { '#map': [[{ '#bigint': '1' }, 'a']] }, + j: { tag: 'A', value: { '#bigint': '2' } }, }, ], } @@ -86,4 +88,28 @@ describe('toItf', () => { `round trip conversion of trace failed` ) }) + + it('converts unit type from Apalache', () => { + const text = '{ a: () }' + + const trace = [buildExpression(text)] + const vars = ['a'] + const itfTrace = { + vars: vars, + states: [ + { + '#meta': { + index: 0, + }, + a: 'U_OF_UNIT', + }, + ], + } + + const roundTripTrace = ofItf(itfTrace) + assert( + zip(roundTripTrace, trace).every(([a, b]) => quintExAreEqual(a, b)), + `round trip conversion of trace failed` + ) + }) }) diff --git a/quint/test/names/collector.test.ts b/quint/test/names/collector.test.ts index 40fc688dc..16e014675 100644 --- a/quint/test/names/collector.test.ts +++ b/quint/test/names/collector.test.ts @@ -4,7 +4,7 @@ import { buildModuleWithDecls } from '../builders/ir' import { QuintError, QuintModule } from '../../src' import { NameCollector } from '../../src/names/collector' import { walkModule } from '../../src/ir/IRVisitor' -import { DefinitionsByName } from '../../src/names/base' +import { DefinitionsByName, getTopLevelDef } from '../../src/names/base' import { zerog } from '../../src/idGenerator' describe('NameCollector', () => { @@ -31,8 +31,8 @@ describe('NameCollector', () => { assert.deepInclude([...definitions.keys()], 'a') assert.notDeepInclude([...definitions.keys()], 'b') - assert.deepEqual(definitions.get('a')?.importedFrom?.kind, 'import') - assert.deepEqual(definitions.get('a')?.namespaces ?? [], []) + assert.deepEqual(getTopLevelDef(definitions, 'a')?.importedFrom?.kind, 'import') + assert.deepEqual(getTopLevelDef(definitions, 'a')?.namespaces ?? [], []) }) it('imports all definitions', () => { @@ -51,7 +51,7 @@ describe('NameCollector', () => { assert.isEmpty(errors) - const def = definitions.get('test_module::a') + const def = getTopLevelDef(definitions, 'test_module::a') assert.isTrue(def!.hidden) assert.deepEqual(def?.kind, 'def') }) @@ -63,7 +63,7 @@ describe('NameCollector', () => { assert.isEmpty(errors) - const def = definitions.get('my_import::a') + const def = getTopLevelDef(definitions, 'my_import::a') assert.isTrue(def!.hidden) assert.deepEqual(def?.kind, 'def') }) @@ -81,8 +81,8 @@ describe('NameCollector', () => { assert.includeDeepMembers([...definitions.keys()], ['test_module_instance::c1', 'test_module_instance::c2']) assert.includeDeepMembers([...definitions.keys()], ['test_module_instance::T']) - assert.deepEqual(definitions.get('test_module_instance::a')?.importedFrom?.kind, 'instance') - assert.deepEqual(definitions.get('test_module_instance::a')?.namespaces ?? [], [ + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.importedFrom?.kind, 'instance') + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.namespaces ?? [], [ 'test_module_instance', 'wrapper', ]) @@ -114,7 +114,7 @@ describe('NameCollector', () => { zerog ) - const [errors, _definitions] = collect(quintModule) + const [errors, definitions] = collect(quintModule) assert.sameDeepMembers(errors, [ { @@ -124,6 +124,8 @@ describe('NameCollector', () => { data: {}, }, ]) + + assert.deepEqual(getTopLevelDef(definitions, 'test_module_instance::a')?.kind, 'def') }) it('fails importing itself', () => { @@ -148,8 +150,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports previously imported definitions', () => { @@ -158,8 +160,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports imported definitions that were previously qualified', () => { @@ -168,8 +170,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isNotTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('T')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports specific definitions', () => { @@ -179,9 +181,9 @@ describe('NameCollector', () => { assert.isEmpty(errors) // a is not hidden anymore - assert.isNotTrue(definitions.get('a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'a')!.hidden) // T is still hidden - assert.isTrue(definitions.get('T')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'T')!.hidden) }) it('exports definitions with qualifier', () => { @@ -194,8 +196,8 @@ describe('NameCollector', () => { const [errors, definitions] = collect(quintModule) assert.isEmpty(errors) - assert.isTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('my_export::a')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'my_export::a')!.hidden) }) it('exports definitions with namespace', () => { @@ -205,14 +207,14 @@ describe('NameCollector', () => { assert.isEmpty(errors) - assert.isTrue(definitions.get('a')!.hidden) - assert.isNotTrue(definitions.get('test_module::a')!.hidden) + assert.isTrue(getTopLevelDef(definitions, 'a')!.hidden) + assert.isNotTrue(getTopLevelDef(definitions, 'test_module::a')!.hidden) - assert.deepEqual(definitions.get('a')?.importedFrom?.kind, 'import') - assert.deepEqual(definitions.get('test_module::a')?.importedFrom?.kind, 'export') + assert.deepEqual(getTopLevelDef(definitions, 'a')?.importedFrom?.kind, 'import') + assert.deepEqual(getTopLevelDef(definitions, 'test_module::a')?.importedFrom?.kind, 'export') - assert.deepEqual(definitions.get('a')?.namespaces ?? [], []) - assert.deepEqual(definitions.get('test_module::a')?.namespaces ?? [], ['test_module']) + assert.deepEqual(getTopLevelDef(definitions, 'a')?.namespaces ?? [], []) + assert.deepEqual(getTopLevelDef(definitions, 'test_module::a')?.namespaces ?? [], ['test_module']) }) it('fails exporting unexisting definition', () => { diff --git a/quint/test/names/resolver.test.ts b/quint/test/names/resolver.test.ts index a8af5a48f..f2a7208b8 100644 --- a/quint/test/names/resolver.test.ts +++ b/quint/test/names/resolver.test.ts @@ -4,7 +4,7 @@ import { assert } from 'chai' import { NameResolutionResult } from '../../src/names/base' import { resolveNames } from '../../src/names/resolver' import { buildModule, buildModuleWithDecls } from '../builders/ir' -import { zerog } from '../../src/idGenerator' +import { IdGenerator, newIdGenerator, zerog } from '../../src/idGenerator' describe('resolveNames', () => { const baseDefs = [ @@ -13,14 +13,16 @@ describe('resolveNames', () => { 'type MY_TYPE = int', ] - function resolveNamesForExprs(exprs: string[]): NameResolutionResult { - const module = buildModule(baseDefs, exprs, undefined, zerog) + function resolveNamesForExprs(exprs: string[], idGenerator?: IdGenerator): NameResolutionResult { + const idGen = idGenerator ?? zerog + const module = buildModule(baseDefs, exprs, undefined, idGen) return resolveNames([module]) } - function resolveNamesForDefs(defs: string[]): NameResolutionResult { - const module = buildModuleWithDecls(baseDefs.concat(defs), undefined, zerog) + function resolveNamesForDefs(defs: string[], idGenerator?: IdGenerator): NameResolutionResult { + const idGen = idGenerator ?? zerog + const module = buildModuleWithDecls(baseDefs.concat(defs), undefined, idGen) return resolveNames([module]) } @@ -80,6 +82,44 @@ describe('resolveNames', () => { { code: 'QNT404', message: "Name 'x' not found", reference: 0n, data: {} }, ]) }) + + it('finds a definition itself with depth information', () => { + const result = resolveNamesForExprs([], newIdGenerator()) + + assert.isEmpty(result.errors) + + const def = [...result.table.values()].find(def => def.name === 'unscoped_def' || def.kind === 'def') + + assert.isNotNull(def) + assert.deepEqual(result.table.get(def!.id)?.depth, 0) + }) + }) + + describe('shadowing', () => { + it('resolves shadowed names', () => { + const result = resolveNamesForDefs( + ['val shadowing = def foo = (shadowing) => shadowing { foo(1) }', 'val a = shadowing'], + newIdGenerator() + ) + + assert.isEmpty(result.errors) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' && def.kind === 'def')) + assert.isTrue([...result.table.values()].some(def => def.name === 'shadowing' && def.kind === 'param')) + }) + + it('collects depth and shadowing information properly', () => { + const result = resolveNamesForDefs(['val shadowing = val a = 1 { val a = 2 { a } }'], newIdGenerator()) + + assert.isEmpty(result.errors) + assert.isTrue( + [...result.table.values()].some(def => def.name === 'a' && def.depth === 2), + 'Could not find first a' + ) + assert.isTrue( + [...result.table.values()].some(def => def.name === 'a' && def.depth === 3 && def.shadowing === true), + 'Could not find second a' + ) + }) }) describe('type aliases', () => { @@ -93,7 +133,7 @@ describe('resolveNames', () => { const result = resolveNamesForDefs([ 'const a: UNKNOWN_TYPE_0', 'var b: UNKNOWN_TYPE_1', - 'type C = Set[t]', + 'type C[t] = Set[t]', 'assume d = 1', ]) diff --git a/quint/test/names/unshadower.test.ts b/quint/test/names/unshadower.test.ts index 9cf6ce65b..0fe892a54 100644 --- a/quint/test/names/unshadower.test.ts +++ b/quint/test/names/unshadower.test.ts @@ -21,8 +21,11 @@ describe('unshadowNames', () => { it('returns a module with no shadowed names', () => { const { modules, table } = parseModules(` module A { - def f(a) = a > 0 val b = val a = 1 { a } + val c = val a = { val a = 1 { a } } { a } + val d = val a = 1 { val a = 2 { a } } + def f(a) = a > 0 + def g(a) = a.map(a => a + 1) } module B { @@ -34,8 +37,11 @@ describe('unshadowNames', () => { assert.sameDeepMembers(unshadowedModules.map(moduleToString), [ dedent(`module A { - | val b = val a_9 = 1 { a_9 } - | def f = ((a_5) => igt(a_5, 0)) + | val d = val a = 1 { val a_19 = 2 { a_19 } } + | def f = ((a_26) => igt(a_26, 0)) + | def g = ((a_36) => map(a_36, ((a_34) => iadd(a_34, 1)))) + | val b = val a = 1 { a } + | val c = val a = val a_9 = 1 { a_9 } { a } |}`), dedent(`module B { | var a: int diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 42f7d55b7..704926088 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -103,7 +103,7 @@ describe('parsing', () => { readQuint('SuperSpec'), 'mocked_path/testFixture/SuperSpec.qnt' ) - assert.isEmpty(result.errors) + assert.deepEqual(result.errors, []) }) it('parses SuperSpec correctly', () => { @@ -118,6 +118,10 @@ describe('parsing', () => { parseAndCompare('_1043sumTypeDecl') }) + it('parses polymorphic type declarations', () => { + parseAndCompare('_1045polymorphicTypeDecl') + }) + it('parses match expressions', () => { parseAndCompare('_1044matchExpression') }) @@ -132,7 +136,7 @@ describe('syntax errors', () => { assert.equal(errors.length, 1) assert.equal( errors[0].message, - `mismatched input '' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `mismatched input '' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -143,7 +147,7 @@ describe('syntax errors', () => { assert.equal(errors.length, 1) assert.equal( errors[0].message, - `extraneous input 'something' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `extraneous input 'something' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -190,7 +194,7 @@ describe('syntax errors', () => { assert.isAtLeast(errors.length, 1) assert.equal( errors[0].message, - `extraneous input '(' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}` + `extraneous input '(' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'import', 'export', DOCCOMMENT}` ) assert.equal(errors[0].code, 'QNT000') }) @@ -214,6 +218,24 @@ describe('syntax errors', () => { assert.equal(errors[0].message, `mismatched input ''' expecting STRING`) assert.equal(errors[0].code, 'QNT000') }) + + it('error on type declarations with undeclared variables', () => { + // we should use double quotes + const code = `module singleQuotes { type T = (List[a], Set[b]) }` + const [error] = parseErrorsFrom(defaultSourceName, code) + assert.deepEqual(error.code, 'QNT014') + assert.deepEqual( + error.message, + `the type variables a, b are unbound. +E.g., in + + type T = List[a] + +type variable 'a' is unbound. To fix it, write + + type T[a] = List[a]` + ) + }) }) // Test the JSON error output. Most of the tests here should migrate to the diff --git a/quint/test/repl.test.ts b/quint/test/repl.test.ts index 8b9e3e357..128b7006b 100644 --- a/quint/test/repl.test.ts +++ b/quint/test/repl.test.ts @@ -148,7 +148,11 @@ describe('repl ok', () => { |^^^^^^^^^ | | - |1 + |runtime error: error: [QNT501] Expected an integer value + |1 + false + |^^^^^^^^^ + | + | |>>> ` ) await assertRepl(input, output) diff --git a/quint/test/runtime/compile.test.ts b/quint/test/runtime/compile.test.ts index 28d9a2ebd..5e5b2ddc3 100644 --- a/quint/test/runtime/compile.test.ts +++ b/quint/test/runtime/compile.test.ts @@ -3,7 +3,7 @@ import { assert } from 'chai' import { Either, left, right } from '@sweet-monads/either' import { just } from '@sweet-monads/maybe' import { expressionToString } from '../../src/ir/IRprinting' -import { Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' +import { Callable, Computable, ComputableKind, fail, kindName } from '../../src/runtime/runtime' import { noExecutionListener } from '../../src/runtime/trace' import { CompilationContext, @@ -36,7 +36,15 @@ const idGen = newIdGenerator() function assertResultAsString(input: string, expected: string | undefined, evalContext: string = '') { const moduleText = `module contextM { ${evalContext} } module __runtime { import contextM.*\n val ${inputDefName} = ${input} }` const mockLookupPath = stringSourceResolver(new Map()).lookupPath('/', './mock') - const context = compileFromCode(idGen, moduleText, '__runtime', mockLookupPath, noExecutionListener, newRng().next) + const context = compileFromCode( + idGen, + moduleText, + '__runtime', + mockLookupPath, + noExecutionListener, + newRng().next, + false + ) assert.isEmpty(context.syntaxErrors, `Syntax errors: ${context.syntaxErrors.map(quintErrorToString).join(', ')}`) assert.isEmpty(context.compileErrors, `Compile errors: ${context.compileErrors.map(quintErrorToString).join(', ')}`) @@ -65,7 +73,15 @@ function assertComputableAsString(computable: Computable, expected: string | und function evalInContext(input: string, callable: (ctx: CompilationContext) => Either) { const moduleText = `module __runtime { ${input} }` const mockLookupPath = stringSourceResolver(new Map()).lookupPath('/', './mock') - const context = compileFromCode(idGen, moduleText, '__runtime', mockLookupPath, noExecutionListener, newRng().next) + const context = compileFromCode( + idGen, + moduleText, + '__runtime', + mockLookupPath, + noExecutionListener, + newRng().next, + false + ) return callable(context) } @@ -80,56 +96,84 @@ function assertVarExists(kind: ComputableKind, name: string, input: string) { res.mapLeft(m => assert.fail(m)) } +// compile a computable for a run definition +function callableFromContext(ctx: CompilationContext, callee: string): Either { + let key = undefined + const lastModule = ctx.compilationState.modules[ctx.compilationState.modules.length - 1] + const def = lastModule.declarations.find(def => def.kind === 'def' && def.name === callee) + if (!def) { + return left(`${callee} definition not found`) + } + key = kindName('callable', def.id) + if (!key) { + return left(`${callee} not found`) + } + const run = ctx.evaluationState.context.get(key) as Callable + if (!run) { + return left(`${callee} not found via ${key}`) + } + + return right(run) +} + // Scan the context for a callable. If found, evaluate it and return the value of the given var. -// Assumes the input has a single callable -// `callee` is used for error reporting. -function evalVarAfterCall(varName: string, callee: string, input: string): Either { +// Assumes the input has a single definition whose name is stored in `callee`. +function evalVarAfterRun(varName: string, callee: string, input: string): Either { // use a combination of Maybe and Either. // Recall that left(...) is used for errors, // whereas right(...) is used for non-errors in sweet monads. const callback = (ctx: CompilationContext): Either => { - let key = undefined - const lastModule = ctx.compilationState.modules[ctx.compilationState.modules.length - 1] - const def = lastModule.declarations.find(def => def.kind === 'def' && def.name === callee) - if (!def) { - return left(`${callee} definition not found`) - } - key = kindName('callable', def.id) - if (!key) { - return left(`${callee} not found`) - } - const run = ctx.evaluationState.context.get(key) - if (!run) { - return left(`${callee} not found via ${key}`) - } + return callableFromContext(ctx, callee) + .mapRight(run => { + return run + .eval() + .map(res => { + if ((res as RuntimeValue).toBool() === true) { + // extract the value of the state variable + const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() + if (nextVal.isNone()) { + return left(`Value of the variable ${varName} is undefined`) + } else { + return right(expressionToString(nextVal.value.toQuintEx(idGen))) + } + } else { + const s = expressionToString(res.toQuintEx(idGen)) + const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` + return left(m) + } + }) + .or(just(left(`Value of ${callee} is undefined`))) + .unwrap() + }) + .join() + } - return run - .eval() - .map(res => { - if ((res as RuntimeValue).toBool() === true) { - // extract the value of the state variable - const nextVal = (ctx.evaluationState.context.get(kindName('nextvar', varName)) ?? fail).eval() - // using if-else, as map-or-unwrap confuses the compiler a lot - if (nextVal.isNone()) { - return left(`Value of the variable ${varName} is undefined`) - } else { - return right(expressionToString(nextVal.value.toQuintEx(idGen))) - } - } else { - const s = expressionToString(res.toQuintEx(idGen)) - const m = `Callable ${callee} was expected to evaluate to true, found: ${s}` - return left(m) - } + return evalInContext(input, callback) +} + +// Evaluate a run and return the result. +function evalRun(callee: string, input: string): Either { + // Recall that left(...) is used for errors, + // whereas right(...) is used for non-errors in sweet monads. + const callback = (ctx: CompilationContext): Either => { + return callableFromContext(ctx, callee) + .mapRight(run => { + return run + .eval() + .map(res => { + return right(expressionToString(res.toQuintEx(idGen))) + }) + .or(just(left(`Value of ${callee} is undefined`))) + .unwrap() }) - .or(just(left(`Value of ${callee} is undefined`))) - .unwrap() + .join() } return evalInContext(input, callback) } function assertVarAfterCall(varName: string, expected: string, callee: string, input: string) { - evalVarAfterCall(varName, callee, input) + evalVarAfterRun(varName, callee, input) .mapLeft(m => assert.fail(m)) .mapRight(output => assert(expected === output, `Expected ${varName} == ${expected}, found ${output}`)) } @@ -845,7 +889,7 @@ describe('compiling specs to runtime values', () => { it('can compile construction of sum type variants', () => { const context = 'type T = Some(int) | None' assertResultAsString('Some(40 + 2)', 'variant("Some", 42)', context) - assertResultAsString('None', 'variant("None", Rec())', context) + assertResultAsString('None', 'variant("None", Tup())', context) }) it('can compile elimination of sum type variants via match', () => { @@ -933,7 +977,7 @@ describe('compiling specs to runtime values', () => { }) describe('compile runs', () => { - it('then', () => { + it('then ok', () => { const input = dedent( `var n: int |run run1 = (n' = 1).then(n' = n + 2).then(n' = n * 4) @@ -943,6 +987,30 @@ describe('compiling specs to runtime values', () => { assertVarAfterCall('n', '12', 'run1', input) }) + it('then fails when rhs is unreachable', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(all { n == 0, n' = n + 2 }).then(n' = 3) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) + .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + }) + + it('then returns false when rhs is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(all { n == 0, n' = n + 2 }) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.equal(result, 'false')) + .mapLeft(m => assert.fail(`Expected the run to return false, found: ${m}`)) + }) + it('reps', () => { const input = dedent( `var n: int @@ -958,6 +1026,18 @@ describe('compiling specs to runtime values', () => { assertVarAfterCall('hist', 'List(0, 1, 2)', 'run2', input) }) + it('reps fails when action is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(10.reps(i => all { n < 5, n' = n + 1 })) + ` + ) + + evalRun('run1', input) + .mapRight(result => assert.fail(`Expected the run to fail, found: ${result}`)) + .mapLeft(m => assert.equal(m, 'Value of run1 is undefined')) + }) + it('fail', () => { const input = dedent( `var n: int @@ -965,7 +1045,7 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) }) it('assert', () => { @@ -975,7 +1055,58 @@ describe('compiling specs to runtime values', () => { ` ) - evalVarAfterCall('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected an error, found: ${m}`)) + }) + + it('expect fails', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n < 3) + ` + ) + + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('expect ok', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n == 3) + ` + ) + + assertVarAfterCall('n', '3', 'run1', input) + }) + + it('expect fails when left-hand side is false', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(all { n == 1, n' = 3 }).expect(n < 3) + ` + ) + + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('expect and then expect fail', () => { + const input = dedent( + `var n: int + |run run1 = (n' = 0).then(n' = 3).expect(n == 3).then(n' = 4).expect(n == 3) + ` + ) + + evalVarAfterRun('n', 'run1', input).mapRight(m => assert.fail(`Expected the run to fail, found: ${m}`)) + }) + + it('q::debug', () => { + // `q::debug(s, a)` returns `a` + const input = dedent( + `var n: int + |run run1 = (n' = 1).then(n' = q::debug("n plus one", n + 1)) + ` + ) + + assertVarAfterCall('n', '2', 'run1', input) }) it('unsupported operators', () => { @@ -1042,6 +1173,7 @@ describe('incremental compilation', () => { newEvaluationState(noExecutionListener), flattenedTable, dummyRng.next, + false, moduleToCompile.declarations ) } @@ -1057,7 +1189,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const expr = parsed.kind === 'expr' ? parsed.expr : undefined - const context = compileExpr(compilationState, evaluationState, dummyRng, expr!) + const context = compileExpr(compilationState, evaluationState, dummyRng, false, expr!) assert.deepEqual(context.compilationState.analysisOutput.types.get(expr!.id)?.type, { kind: 'int', id: 3n }) @@ -1076,7 +1208,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const defs = parsed.kind === 'declaration' ? parsed.decls : undefined - const context = compileDecls(compilationState, evaluationState, dummyRng, defs!) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, defs!) assert.deepEqual(context.compilationState.analysisOutput.types.get(defs![0].id)?.type, { kind: 'int', id: 3n }) @@ -1097,7 +1229,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) assert.sameDeepMembers(context.syntaxErrors, [ { @@ -1118,7 +1250,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) const typeDecl = decls[0] assert(typeDecl.kind === 'typedef') @@ -1137,7 +1269,7 @@ describe('incremental compilation', () => { compilationState.sourceMap ) const decls = parsed.kind === 'declaration' ? parsed.decls : [] - const context = compileDecls(compilationState, evaluationState, dummyRng, decls) + const context = compileDecls(compilationState, evaluationState, dummyRng, false, decls) assert(decls.find(t => t.kind === 'typedef' && t.name === 'T')) // Sum type declarations are expanded to add an diff --git a/quint/test/types/aliasInliner.test.ts b/quint/test/types/aliasInliner.test.ts index 3d57494d1..931b738ba 100644 --- a/quint/test/types/aliasInliner.test.ts +++ b/quint/test/types/aliasInliner.test.ts @@ -70,13 +70,13 @@ describe('inlineAliases', () => { const { modules } = inlineModule(quintModule) const expectedModule = dedent(`module A { - | type T1 = (B({}) | C({})) - | val C: (B({}) | C({})) = variant("C", Rec()) - | type T2 = (Some((B({}) | C({}))) | None({})) - | val B: (B({}) | C({})) = variant("B", Rec()) - | def Some: ((B({}) | C({}))) => (Some((B({}) | C({}))) | None({})) = ((__SomeParam) => variant("Some", __SomeParam)) - | val None: (Some((B({}) | C({}))) | None({})) = variant("None", Rec()) - | var x: (Some((B({}) | C({}))) | None({})) + | type T1 = (B | C) + | val C: (B | C) = variant("C", Tup()) + | type T2 = (Some((B | C)) | None) + | val B: (B | C) = variant("B", Tup()) + | def Some: ((B | C)) => (Some((B | C)) | None) = ((__SomeParam) => variant("Some", __SomeParam)) + | val None: (Some((B | C)) | None) = variant("None", Tup()) + | var x: (Some((B | C)) | None) |}`) assert.deepEqual(moduleToString(modules[0]), expectedModule) diff --git a/quint/test/types/constraintGenerator.test.ts b/quint/test/types/constraintGenerator.test.ts index 8cb3fd0bf..784b62915 100644 --- a/quint/test/types/constraintGenerator.test.ts +++ b/quint/test/types/constraintGenerator.test.ts @@ -162,14 +162,6 @@ describe('ConstraintGeneratorVisitor', () => { ) }) - it('catches invalid arity on Tup operator', () => { - testArityError( - 'val x = Tup()', - 'Checking arity for application of Tup', - 'Operator expects at least one arguments but was given 0' - ) - }) - it('catches invalid arity on item operator', () => { testArityError( 'val x = (0, 1).item()', diff --git a/quint/test/types/inferrer.test.ts b/quint/test/types/inferrer.test.ts index 9a79b415c..4e829c489 100644 --- a/quint/test/types/inferrer.test.ts +++ b/quint/test/types/inferrer.test.ts @@ -2,16 +2,42 @@ import { describe, it } from 'mocha' import { assert } from 'chai' import { TypeInferenceResult, TypeInferrer } from '../../src/types/inferrer' import { typeSchemeToString } from '../../src/types/printing' -import { errorTreeToString } from '../../src/errorTree' +import { ErrorTree, errorTreeToString } from '../../src/errorTree' import { parseMockedModule } from '../util' +import { TypeApplicationResolver } from '../../src/types/typeApplicationResolution' + +// Utility used to print update `stringType` values to make +// updating the expected values in the following tests less +// painful. +function _printUpdatedStringTypes(stringTypes: (string | bigint)[][]) { + console.log('[') + stringTypes.forEach(([n, t]) => console.log(`[${n}n, '${t}'],`)) + console.log(']') +} describe('inferTypes', () => { - function inferTypesForDefs(defs: string[]): TypeInferenceResult { - const text = `module wrapper { ${defs.join('\n')} }` - const { modules, table } = parseMockedModule(text) + function inferTypesForModules(text: string): TypeInferenceResult { + const { modules: parsedModules, table } = parseMockedModule(text) + // Type inference assumes all type applications (e.g., `Foo[int, str]`) have been resolved. + const resolver = new TypeApplicationResolver(table) const inferrer = new TypeInferrer(table) - return inferrer.inferTypes(modules[0].declarations) + + // Used to collect errors found during type application + let typeAppErrs: Map = new Map() + const modules = parsedModules.map(m => { + const [errs, declarations] = resolver.resolveTypeApplications(m.declarations) + typeAppErrs = new Map([...typeAppErrs, ...errs]) + return { ...m, declarations } + }) + const [inferenceErrors, inferenceSchemes] = inferrer.inferTypes(modules.flatMap(m => m.declarations)) + const combinedErrors = new Map([...inferenceErrors, ...typeAppErrs]) + return [combinedErrors, inferenceSchemes] + } + + function inferTypesForDefs(defs: string[]): TypeInferenceResult { + const text = `module wrapper { ${defs.join('\n')} }` + return inferTypesForModules(text) } it('infers types for basic expressions', () => { @@ -21,6 +47,7 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, 'int'], [2n, 'int'], @@ -32,20 +59,22 @@ describe('inferTypes', () => { [8n, 'int'], [9n, 'int'], [10n, '(int, int) => int'], - [11n, 'int'], + [11n, '(int, int) => int'], [12n, 'int'], [13n, 'int'], [14n, 'int'], [15n, 'int'], - [16n, 'Set[int]'], + [16n, 'int'], [17n, 'Set[int]'], - [18n, 'int'], + [18n, 'Set[int]'], [19n, 'int'], [20n, 'int'], [21n, 'int'], - [22n, '(int) => int'], - [23n, 'Set[int]'], - [24n, '(Set[int]) => Set[int]'], + [22n, 'int'], + [23n, '(int) => int'], + [24n, 'Set[int]'], + [25n, '(Set[int]) => Set[int]'], + [26n, '(Set[int]) => Set[int]'], ]) }) @@ -56,21 +85,24 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '∀ t0, t1 . (t0) => t1'], - [2n, '∀ t0 . t0'], - [3n, '∀ t0 . t0'], - [4n, '∀ t0 . t0'], - [5n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], - [6n, '(bool) => int'], - [7n, 'bool'], + [7n, '(bool) => int'], [8n, 'bool'], - [9n, 'int'], - [10n, 'bool'], + [9n, 'bool'], + [10n, 'int'], [11n, 'bool'], - [12n, 'int'], + [12n, 'bool'], [13n, 'int'], - [14n, '((bool) => int, bool) => int'], + [14n, 'int'], + [15n, '((bool) => int, bool) => int'], + [16n, '((bool) => int, bool) => int'], + [1n, '(t_p_2) => _t4'], + [2n, 't_p_2'], + [3n, 't_p_2'], + [4n, '_t4'], + [5n, '((t_p_2) => _t4, t_p_2) => _t4'], + [6n, '∀ t0, t1 . ((t0) => t1, t0) => t1'], ]) }) @@ -86,30 +118,32 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [4n, '{ f1: int, f2: bool }'], [5n, '{ f1: int, f2: bool }'], - [6n, 'int'], [7n, 'str'], - [8n, 'bool'], + [6n, 'int'], [9n, 'str'], + [8n, 'bool'], [10n, '{ f1: int, f2: bool }'], [11n, 'Set[{ f1: int, f2: bool }]'], [12n, 'Set[{ f1: int, f2: bool }]'], - [13n, '∀ r0 . { f1: int | r0 }'], + [13n, '{ f1: int | tail__t3 }'], [14n, '{ f1: int, f2: bool }'], [15n, 'str'], - [16n, '∀ r0 . { f1: int | r0 }'], + [16n, '{ f1: int | tail__t3 }'], [17n, 'str'], [18n, 'int'], [19n, '{ f1: int, f2: bool }'], - [20n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], - [21n, 'int'], - [22n, 'str'], - [23n, '{ f1: int }'], - [24n, '{ f1: int, f2: bool }'], - [25n, 'Set[str]'], + [20n, '({ f1: int | tail__t3 }) => { f1: int, f2: bool }'], + [21n, '∀ r0 . ({ f1: int | r0 }) => { f1: int, f2: bool }'], + [23n, 'str'], + [22n, 'int'], + [24n, '{ f1: int }'], + [25n, '{ f1: int, f2: bool }'], [26n, 'Set[str]'], + [27n, 'Set[str]'], ]) }) @@ -120,17 +154,19 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '∀ t0, r0 . (t0 | r0)'], - [2n, '∀ t0, t1, r0 . (t0, t1 | r0)'], - [3n, '∀ t0, r0 . (t0 | r0)'], + [1n, '(_t0 | tail__t0)'], + [2n, '(tup__t1_0, _t1 | tail__t1)'], + [3n, '(_t0 | tail__t0)'], [4n, 'int'], - [5n, '∀ t0 . t0'], - [6n, '∀ t0, t1, r0 . (t0, t1 | r0)'], + [5n, '_t0'], + [6n, '(tup__t1_0, _t1 | tail__t1)'], [7n, 'int'], - [8n, '∀ t0 . t0'], - [9n, '∀ t0, t1 . (t0, t1)'], - [10n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], + [8n, '_t1'], + [9n, '(_t0, _t1)'], + [10n, '((_t0 | tail__t0), (tup__t1_0, _t1 | tail__t1)) => (_t0, _t1)'], + [11n, '∀ t0, t1, t2, r0, r1 . ((t0 | r0), (t1, t2 | r1)) => (t0, t2)'], ]) }) @@ -141,24 +177,41 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], - [16n, '(A(int) | B({}))'], - [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [5n, 'int'], - [4n, 'str'], + [15n, 'str'], + [16n, 'int'], + [17n, '(A(int) | B(()))'], + [18n, '(A(int) | B(()))'], [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B(()))'], + [9n, '(int) => (A(int) | B(()))'], + [10n, '(int) => (A(int) | B(()))'], + [11n, 'str'], + [12n, '()'], + [13n, '(B(()) | A(int))'], + [14n, '(B(()) | A(int))'], ]) }) + it('infers types for different sum type declarations with the same label but different values', () => { + // See https://github.com/informalsystems/quint/issues/1275 + const text = ` +module A { + type T1 = | A(int) +} + +module B { + type T2 = | A(bool) +} +` + + const [errors, _] = inferTypesForModules(text) + assert.deepEqual([...errors.entries()], []) + }) + it('infers types for match expression', () => { const defs = ['type T = A(int) | B', 'val a = variant("A", 3)', 'val nine = match a { A(n) => n * n | B => 9 }'] @@ -166,34 +219,35 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [14n, 'str'], - [15n, 'int'], - [16n, '(A(int) | B({}))'], - [17n, '(A(int) | B({}))'], - [10n, 'str'], - [11n, '{}'], - [12n, '(B({}) | A(int))'], - [13n, '(B({}) | A(int))'], - [18n, '(A(int) | B({}))'], - [24n, 'str'], - [26n, 'int'], - [19n, 'int'], + [15n, 'str'], + [16n, 'int'], + [17n, '(A(int) | B(()))'], + [18n, '(A(int) | B(()))'], + [6n, 'int'], + [5n, 'str'], + [7n, 'int'], + [8n, '(A(int) | B(()))'], + [9n, '(int) => (A(int) | B(()))'], + [10n, '(int) => (A(int) | B(()))'], + [11n, 'str'], + [12n, '()'], + [13n, '(B(()) | A(int))'], + [14n, '(B(()) | A(int))'], + [19n, '(A(int) | B(()))'], + [25n, 'str'], + [27n, 'int'], [20n, 'int'], [21n, 'int'], - [25n, '(int) => int'], - [27n, 'str'], - [29n, '{}'], [22n, 'int'], - [28n, '({}) => int'], + [26n, '(int) => int'], + [28n, 'str'], + [30n, '()'], [23n, 'int'], - [30n, 'int'], - [5n, 'int'], - [4n, 'str'], - [6n, 'int'], - [7n, '(A(int) | B({}))'], - [8n, '(int) => (A(int) | B({}))'], - [9n, '(int) => (A(int) | B({}))'], + [29n, '(()) => int'], + [24n, 'int'], + [31n, 'int'], ]) }) @@ -293,7 +347,7 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) - assert.includeDeepMembers(stringTypes, [[14n, '(str) => bool']]) + assert.includeDeepMembers(stringTypes, [[15n, '(str) => bool']]) }) it('considers annotations', () => { @@ -303,10 +357,12 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ [1n, 'int'], [5n, 'int'], [6n, '(int) => int'], + [7n, '(int) => int'], ]) }) @@ -317,13 +373,15 @@ describe('inferTypes', () => { assert.isEmpty(errors, `Should find no errors, found: ${[...errors.values()].map(errorTreeToString)}`) const stringTypes = Array.from(types.entries()).map(([id, type]) => [id, typeSchemeToString(type)]) + // _printUpdatedStringTypes(stringTypes) assert.sameDeepMembers(stringTypes, [ - [1n, '(int -> str)'], + [4n, '(int -> str)'], [6n, '(int -> str)'], [7n, 'Set[int]'], [8n, 'Set[int]'], [9n, 'int'], [10n, 'int'], + [11n, '((int -> str)) => int'], [12n, '((int -> str)) => int'], ]) }) @@ -352,6 +410,75 @@ describe('inferTypes', () => { ) }) + it('checks correct polymorphic types', () => { + const defs = [ + 'type Option[a] = Some(a) | None', + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[a, e], f: a => b): Result[b, e] = + match r { + | Ok(x) => Ok(f(x)) + | Err(_) => r + }`, + `def option_to_result(o: Option[ok], e: err): Result[ok, err] = + match o { + | Some(x) => Ok(x) + | None => Err(e) + }`, + 'val nested_type_application: Result[Option[int], str] = Ok(Some(42))', + ] + + const [errors, _] = inferTypesForDefs(defs) + assert.sameDeepMembers([...errors.entries()], []) + }) + + it('fails when polymorphic types are not unifiable', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `def result_map(r: Result[bool, e]): Result[int, e] = + match r { + | Ok(x) => Ok(x) + | Err(_) => r + }`, + ] + + const [errors] = inferTypesForDefs(defs) + assert.isNotEmpty([...errors.entries()]) + + const actualErrors = [...errors.entries()].map(e => errorTreeToString(e[1])) + const expectedError = `Couldn't unify bool and int +Trying to unify bool and int +Trying to unify { Ok: bool, Err: _t5 } and { Ok: int, Err: _t5 } +Trying to unify (Ok(bool) | Err(_t5)) and (Ok(int) | Err(_t5)) +Trying to unify ((Ok(bool) | Err(_t5))) => (Ok(bool) | Err(_t5)) and ((Ok(bool) | Err(_t5))) => (Ok(int) | Err(_t5)) +` + assert.deepEqual(actualErrors, [expectedError]) + }) + + it('errors when polymorphic types are applied to invalid numbers of arguments', () => { + const defs = [ + 'type Result[ok, err] = Ok(ok) | Err(err)', + `val too_many: Result[a, b, c] = Ok(1)`, + `val too_few: Result[a] = Ok(1)`, + ] + + const [errors] = inferTypesForDefs(defs) + assert.isNotEmpty([...errors.entries()]) + + const actualErrors = [...errors.entries()].map(e => errorTreeToString(e[1])) + const expectedErrors = [ + `Couldn't unify sum and app +Trying to unify (Ok(int) | Err(_t3)) and Result[a, b, c] +`, + `too many arguments supplied: Result only accepts 2 parameters +applying type constructor Result to arguments a, b, c +`, + `too few arguments supplied: Result only accepts 2 parameters +applying type constructor Result to arguments a +`, + ] + assert.deepEqual(actualErrors, expectedErrors) + }) + it('fails when types are not unifiable', () => { const defs = ['def a = 1.map(p => p + 10)'] @@ -376,4 +503,24 @@ describe('inferTypes', () => { ] ) }) + + it('prioritizes solving constraints from type annotations', () => { + // Regression test for https://github.com/informalsystems/quint/issues/1177 + // The point is that we expect to report an error trying to unify a string with a + const defs = [ + `pure def foo(s: str): int = { + val x = 1.in(s) // We SHOULD identify an error here, since s is annotated as a str + val y = s + 1 // and NOT identify an error here, incorrectly expecting s to be a set + y +}`, + ] + + const [errors] = inferTypesForDefs(defs) + const msgs: string[] = [...errors.values()].map(errorTreeToString) + const expectedMessage = `Couldn't unify set and str +Trying to unify Set[int] and str +Trying to unify (_t0, Set[_t0]) => bool and (int, str) => _t1 +` + assert.equal(msgs[0], expectedMessage) + }) }) diff --git a/quint/test/types/parser.test.ts b/quint/test/types/parser.test.ts index 7454f8991..31d262f3f 100644 --- a/quint/test/types/parser.test.ts +++ b/quint/test/types/parser.test.ts @@ -46,6 +46,17 @@ describe('parseType', () => { ) }) + // Regression test for https://github.com/informalsystems/quint/issues/1336 + it('parses qualified type constants', () => { + const type = parseType('modname::TypeConstructor') + + assert.isTrue(type.isRight()) + type.map(value => { + assert(value.kind === 'const') + assert.deepEqual(value.name, 'modname::TypeConstructor') + }) + }) + it('parses function of const types', () => { const type = parseType('T1 -> (T2 -> T1)') @@ -85,20 +96,29 @@ describe('parseType', () => { ) }) + it('parses type application', () => { + const type = parseType('Foo[int, bool, str]') + + assert.isTrue(type.isRight()) + type.map(value => + assert.deepEqual(value, { + kind: 'app', + ctor: { kind: 'const', name: 'Foo', id: 5n }, + args: [ + { kind: 'int', id: 1n }, + { kind: 'bool', id: 2n }, + { kind: 'str', id: 3n }, + ], + id: 4n, + }) + ) + }) + it('throws error when type is invalid', () => { - const type = parseType('Set[bool, int]') + const type = parseType('Set(int)') assert.isTrue(type.isLeft()) - type.mapLeft(error => - assert.sameDeepMembers(error, [ - { - // TODO We should not expect a '=>' here, - // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input ',' expecting {'->', '=>', ']'}", - locs: [{ start: { line: 0, col: 8, index: 8 }, end: { line: 0, col: 8, index: 8 } }], - }, - ]) - ) + type.mapLeft(error => assert.deepEqual(error[0].explanation, "missing '[' at '('")) }) it('throws error when row separators are invalid', () => { @@ -110,7 +130,7 @@ describe('parseType', () => { { // TODO We should not expect a '=>' here, // but do because of https://github.com/informalsystems/quint/issues/456 - explanation: "mismatched input '|' expecting {',', '->', '=>'}", + explanation: "mismatched input '|' expecting '}'", locs: [{ start: { line: 0, col: 11, index: 11 }, end: { line: 0, col: 11, index: 11 } }], }, ]) diff --git a/quint/testFixture/ApalacheCompilation.qnt b/quint/testFixture/ApalacheCompilation.qnt new file mode 100644 index 000000000..b1ffde284 --- /dev/null +++ b/quint/testFixture/ApalacheCompilation.qnt @@ -0,0 +1,50 @@ +module ModuleToInstantiate { + const C: int + + val instantiatedValue = C +} + +// Used for import tests and for testing specifying an alternate main module +module ModuleToImport { + val importedValue = 0 + + action init = true + action step = true +} + +module ApalacheCompilation { + // Tests whether we can compile imports + import ModuleToImport.importedValue + + // Tests whether we can compile instances + import ModuleToInstantiate(C = 0).* + + var x: int + + type T = + | A // Test whether we represent the unit correctly + | B(int) + + // Tests whether we will sanitize identifiers + def foo::bar(__123) = __123 + + // TODO: Tests that we remove primes from assignments in the init function + action init = { + x' = importedValue + instantiatedValue + } + + // Tests that we can specify an alternative init via CLI args + action altInit = { + x' = 0 + } + + action step = x' = x + 1 + + // Tests that we can specify an alternative step via CLI args + action altStep = x' = x + 0 + + def inv = x >= 0 + + // Tests that we can specify an alternative invariant via CLI args + def altInv = x >= 0 +} diff --git a/quint/testFixture/SuperSpec.json b/quint/testFixture/SuperSpec.json index e8ae27239..994a4f26a 100644 --- a/quint/testFixture/SuperSpec.json +++ b/quint/testFixture/SuperSpec.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":510,"name":"withConsts","declarations":[{"id":100,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":99,"kind":"app","opcode":"isub","args":[{"id":97,"kind":"int","value":1},{"id":98,"kind":"int","value":2}]}},{"id":104,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":103,"kind":"app","opcode":"imul","args":[{"id":101,"kind":"int","value":2},{"id":102,"kind":"int","value":3}]}},{"id":108,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":107,"kind":"app","opcode":"idiv","args":[{"id":105,"kind":"int","value":2},{"id":106,"kind":"int","value":3}]}},{"id":112,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":111,"kind":"app","opcode":"imod","args":[{"id":109,"kind":"int","value":2},{"id":110,"kind":"int","value":3}]}},{"id":116,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":115,"kind":"app","opcode":"ipow","args":[{"id":113,"kind":"int","value":2},{"id":114,"kind":"int","value":3}]}},{"id":119,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":118,"kind":"app","opcode":"iuminus","args":[{"id":117,"kind":"int","value":100}]}},{"id":123,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":122,"kind":"app","opcode":"igt","args":[{"id":120,"kind":"int","value":2},{"id":121,"kind":"int","value":3}]}},{"id":127,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":126,"kind":"app","opcode":"igte","args":[{"id":124,"kind":"int","value":2},{"id":125,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},{"id":131,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":130,"kind":"app","opcode":"ilt","args":[{"id":128,"kind":"int","value":2},{"id":129,"kind":"int","value":3}]}},{"id":135,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":134,"kind":"app","opcode":"ilte","args":[{"id":132,"kind":"int","value":2},{"id":133,"kind":"int","value":3}]}},{"id":139,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":138,"kind":"app","opcode":"eq","args":[{"id":136,"kind":"int","value":2},{"id":137,"kind":"int","value":3}]}},{"id":143,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":142,"kind":"app","opcode":"neq","args":[{"id":140,"kind":"int","value":2},{"id":141,"kind":"int","value":3}]}},{"id":149,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":148,"kind":"app","opcode":"eq","args":[{"id":146,"kind":"app","opcode":"iadd","args":[{"id":144,"kind":"int","value":2},{"id":145,"kind":"int","value":2}]},{"id":147,"kind":"int","value":4}]}},{"id":153,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":152,"kind":"app","opcode":"in","args":[{"id":150,"kind":"int","value":1},{"id":151,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},{"id":165,"kind":"def","name":"withType","qualifier":"val","expr":{"id":164,"kind":"app","opcode":"Set","args":[{"id":162,"kind":"int","value":1},{"id":163,"kind":"int","value":2}]},"typeAnnotation":{"id":161,"kind":"set","elem":{"id":160,"kind":"int"}}},{"id":166,"kind":"typedef","name":"PROC"},{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},{"id":174,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":173,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22},{"id":233,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":232,"kind":"app","opcode":"and","args":[{"id":230,"kind":"bool","value":false},{"id":231,"kind":"bool","value":true}]}},{"id":237,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":236,"kind":"app","opcode":"or","args":[{"id":234,"kind":"bool","value":false},{"id":235,"kind":"bool","value":true}]}},{"id":241,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":240,"kind":"app","opcode":"implies","args":[{"id":238,"kind":"bool","value":false},{"id":239,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26},{"id":270,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":269,"kind":"app","opcode":"and","args":[{"id":266,"kind":"bool","value":false},{"id":267,"kind":"bool","value":true},{"id":268,"kind":"bool","value":false}]}},{"id":275,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":274,"kind":"app","opcode":"actionAll","args":[{"id":271,"kind":"bool","value":false},{"id":272,"kind":"bool","value":true},{"id":273,"kind":"bool","value":false}]}},{"id":280,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":279,"kind":"app","opcode":"or","args":[{"id":276,"kind":"bool","value":false},{"id":277,"kind":"bool","value":true},{"id":278,"kind":"bool","value":false}]}},{"id":285,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":284,"kind":"app","opcode":"actionAny","args":[{"id":281,"kind":"bool","value":false},{"id":282,"kind":"bool","value":true},{"id":283,"kind":"bool","value":false}]}},{"id":290,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":289,"kind":"app","opcode":"ite","args":[{"id":286,"kind":"bool","value":true},{"id":287,"kind":"int","value":1},{"id":288,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}}},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32},{"id":327,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":326,"kind":"app","opcode":"in","args":[{"id":324,"kind":"int","value":1},{"id":325,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37},{"id":392,"kind":"def","name":"one","qualifier":"val","expr":{"id":391,"kind":"app","opcode":"head","args":[{"id":390,"kind":"app","opcode":"List","args":[{"id":388,"kind":"int","value":1},{"id":389,"kind":"int","value":2}]}]}},{"id":397,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":396,"kind":"app","opcode":"Tup","args":[{"id":393,"kind":"int","value":1},{"id":394,"kind":"int","value":2},{"id":395,"kind":"int","value":3}]}},{"id":402,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":401,"kind":"app","opcode":"Tup","args":[{"id":398,"kind":"int","value":1},{"id":399,"kind":"int","value":2},{"id":400,"kind":"int","value":3}]}},{"id":406,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":405,"kind":"app","opcode":"Tup","args":[{"id":403,"kind":"int","value":4},{"id":404,"kind":"int","value":5}]}},{"id":411,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":410,"kind":"app","opcode":"List","args":[{"id":407,"kind":"int","value":1},{"id":408,"kind":"int","value":2},{"id":409,"kind":"int","value":3}]}},{"id":416,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":415,"kind":"app","opcode":"List","args":[{"id":412,"kind":"int","value":1},{"id":413,"kind":"int","value":2},{"id":414,"kind":"int","value":3}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42},{"id":423,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":422,"kind":"app","opcode":"nth","args":[{"id":420,"kind":"app","opcode":"List","args":[{"id":417,"kind":"int","value":2},{"id":418,"kind":"int","value":3},{"id":419,"kind":"int","value":4}]},{"id":421,"kind":"int","value":2}]}},{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]}},{"id":435,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":434,"kind":"app","opcode":"Rec","args":[{"id":430,"kind":"str","value":"name"},{"id":431,"kind":"str","value":"igor"},{"id":432,"kind":"str","value":"year"},{"id":433,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Set","args":[{"id":444,"kind":"int","value":1},{"id":445,"kind":"int","value":2},{"id":446,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47},{"id":477,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":476,"kind":"app","opcode":"in","args":[{"id":474,"kind":"int","value":2},{"id":475,"kind":"app","opcode":"Set","args":[]}]}},{"id":481,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":480,"kind":"app","opcode":"subseteq","args":[{"id":478,"kind":"app","opcode":"Set","args":[]},{"id":479,"kind":"app","opcode":"Set","args":[]}]}},{"id":490,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":489,"kind":"app","opcode":"in","args":[{"id":483,"kind":"app","opcode":"Set","args":[{"id":482,"kind":"int","value":1}]},{"id":488,"kind":"app","opcode":"powerset","args":[{"id":487,"kind":"app","opcode":"Set","args":[{"id":484,"kind":"int","value":1},{"id":485,"kind":"int","value":2},{"id":486,"kind":"int","value":3}]}]}]}},{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},{"id":504,"kind":"typedef","name":"UNINTERPRETED_TYPE"},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62},{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},{"kind":"var","name":"i","typeAnnotation":{"id":89,"kind":"int"},"id":90},{"kind":"var","name":"j","typeAnnotation":{"id":91,"kind":"bool"},"id":92},{"id":96,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":95,"kind":"app","opcode":"iadd","args":[{"id":93,"kind":"int","value":1},{"id":94,"kind":"int","value":2}]}},{"id":159,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":158,"kind":"app","opcode":"exists","args":[{"id":154,"kind":"name","name":"Bool"},{"id":157,"kind":"lambda","params":[{"id":155,"name":"x"}],"qualifier":"def","expr":{"id":156,"kind":"name","name":"x"}}]}},{"id":170,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":169,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":168,"kind":"set","elem":{"id":167,"kind":"const","name":"PROC"}}},{"id":180,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":180,"kind":"lambda","params":[{"id":175,"name":"x"},{"id":176,"name":"y"}],"qualifier":"puredef","expr":{"id":179,"kind":"app","opcode":"iadd","args":[{"id":177,"kind":"name","name":"x"},{"id":178,"kind":"name","name":"y"}]}}},{"id":185,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":185,"kind":"lambda","params":[{"id":181,"name":"factor"}],"qualifier":"def","expr":{"id":184,"kind":"app","opcode":"imul","args":[{"id":182,"kind":"name","name":"factor"},{"id":183,"kind":"name","name":"n"}]}}},{"id":190,"kind":"def","name":"A","qualifier":"action","expr":{"id":190,"kind":"lambda","params":[{"id":186,"name":"x"}],"qualifier":"action","expr":{"id":189,"kind":"app","opcode":"assign","args":[{"id":188,"kind":"name","name":"n"},{"id":187,"kind":"name","name":"x"}]}}},{"id":194,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":194,"kind":"lambda","params":[{"id":191,"name":"x"}],"qualifier":"puredef","expr":{"id":193,"kind":"app","opcode":"not","args":[{"id":192,"kind":"name","name":"x"}]}}},{"id":204,"kind":"def","name":"H","qualifier":"def","expr":{"id":204,"kind":"lambda","params":[{"id":195,"name":"x"},{"id":196,"name":"y"}],"qualifier":"def","expr":{"id":203,"kind":"app","opcode":"iadd","args":[{"id":201,"kind":"name","name":"x"},{"id":202,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":200,"kind":"oper","args":[{"id":197,"kind":"int"},{"id":198,"kind":"int"}],"res":{"id":199,"kind":"int"}}},{"id":210,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":210,"kind":"lambda","params":[{"id":205,"name":"x"}],"qualifier":"def","expr":{"id":209,"kind":"name","name":"x"}},"typeAnnotation":{"id":208,"kind":"oper","args":[{"id":206,"kind":"var","name":"a"}],"res":{"id":207,"kind":"var","name":"a"}}},{"id":216,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":215,"kind":"app","opcode":"assign","args":[{"id":214,"kind":"name","name":"k"},{"id":213,"kind":"int","value":3}]}},{"id":229,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":229,"kind":"lambda","params":[{"id":217,"name":"x"},{"id":219,"name":"y"}],"qualifier":"puredef","expr":{"id":227,"kind":"app","opcode":"ite","args":[{"id":224,"kind":"app","opcode":"ilt","args":[{"id":222,"kind":"name","name":"x"},{"id":223,"kind":"name","name":"y"}]},{"id":225,"kind":"name","name":"x"},{"id":226,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":228,"kind":"oper","args":[{"id":218,"kind":"int"},{"id":220,"kind":"int"}],"res":{"id":221,"kind":"int"}}},{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}}},{"id":303,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":303,"kind":"lambda","params":[{"id":291,"name":"x"},{"id":292,"name":"y"}],"qualifier":"def","expr":{"id":302,"kind":"app","opcode":"ite","args":[{"id":295,"kind":"app","opcode":"ilt","args":[{"id":293,"kind":"name","name":"x"},{"id":294,"kind":"int","value":10}]},{"id":298,"kind":"app","opcode":"iadd","args":[{"id":296,"kind":"name","name":"y"},{"id":297,"kind":"int","value":5}]},{"id":301,"kind":"app","opcode":"imod","args":[{"id":299,"kind":"name","name":"y"},{"id":300,"kind":"int","value":5}]}]}}},{"id":311,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":310,"kind":"app","opcode":"get","args":[{"id":308,"kind":"name","name":"f1"},{"id":309,"kind":"str","value":"a"}]}},{"id":319,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":318,"kind":"app","opcode":"MyOper","args":[{"id":316,"kind":"str","value":"a"},{"id":317,"kind":"int","value":42}]}},{"id":323,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"MyOper","args":[{"id":320,"kind":"str","value":"a"},{"id":321,"kind":"int","value":42}]}},{"id":335,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":334,"kind":"app","opcode":"filter","args":[{"id":328,"kind":"name","name":"S"},{"id":333,"kind":"lambda","params":[{"id":329,"name":"x"}],"qualifier":"def","expr":{"id":332,"kind":"app","opcode":"igt","args":[{"id":330,"kind":"name","name":"x"},{"id":331,"kind":"int","value":10}]}}]}},{"id":373,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":372,"kind":"app","opcode":"filter","args":[{"id":368,"kind":"name","name":"S"},{"id":371,"kind":"lambda","params":[{"id":369,"name":"_"}],"qualifier":"def","expr":{"id":370,"kind":"bool","value":true}}]}},{"id":381,"kind":"def","name":"f","qualifier":"val","expr":{"id":380,"kind":"app","opcode":"mapBy","args":[{"id":374,"kind":"name","name":"S"},{"id":379,"kind":"lambda","params":[{"id":375,"name":"x"}],"qualifier":"def","expr":{"id":378,"kind":"app","opcode":"iadd","args":[{"id":376,"kind":"name","name":"x"},{"id":377,"kind":"int","value":1}]}}]}},{"id":387,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":386,"kind":"app","opcode":"exclude","args":[{"id":382,"kind":"name","name":"S"},{"id":385,"kind":"app","opcode":"Set","args":[{"id":383,"kind":"int","value":3},{"id":384,"kind":"int","value":4}]}]}},{"id":443,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":442,"kind":"app","opcode":"with","args":[{"id":441,"kind":"app","opcode":"with","args":[{"id":440,"kind":"name","name":"test_record"},{"id":437,"kind":"str","value":"name"},{"id":436,"kind":"str","value":"quint"}]},{"id":439,"kind":"str","value":"year"},{"id":438,"kind":"int","value":2023}]}},{"id":459,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":458,"kind":"let","opdef":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]}},"expr":{"id":457,"kind":"app","opcode":"field","args":[{"id":455,"kind":"name","name":"my_rec"},{"id":456,"kind":"str","value":"a"}]}}},{"id":468,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":467,"kind":"let","opdef":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]}},"expr":{"id":466,"kind":"app","opcode":"item","args":[{"id":464,"kind":"name","name":"my_tup"},{"id":465,"kind":"int","value":2}]}}},{"id":473,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":473,"kind":"lambda","params":[{"id":469,"name":"s"}],"qualifier":"def","expr":{"id":472,"kind":"app","opcode":"eq","args":[{"id":470,"kind":"name","name":"s"},{"id":471,"kind":"app","opcode":"List","args":[]}]}}},{"id":494,"kind":"assume","name":"positive","assumption":{"id":493,"kind":"app","opcode":"igt","args":[{"id":491,"kind":"name","name":"N"},{"id":492,"kind":"int","value":0}]}},{"id":498,"kind":"assume","name":"_","assumption":{"id":497,"kind":"app","opcode":"neq","args":[{"id":495,"kind":"name","name":"N"},{"id":496,"kind":"int","value":0}]}},{"id":499,"kind":"import","defName":"foo","protoName":"M1"},{"id":500,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":505,"kind":"const","name":"INT_SET"},"id":506},{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},{"id":74,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":73,"kind":"lambda","params":[{"id":70,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":72,"kind":"app","opcode":"variant","args":[{"id":69,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":71}]}}},{"id":80,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":79,"kind":"lambda","params":[{"id":76,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":78,"kind":"app","opcode":"variant","args":[{"id":75,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":77}]}}},{"id":86,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":68,"kind":"const","name":"MyUnionType"}},"expr":{"id":85,"kind":"lambda","params":[{"id":82,"name":"__DogParam"}],"qualifier":"def","expr":{"id":84,"kind":"app","opcode":"variant","args":[{"id":81,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":83}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":87,"kind":"const","name":"MyUnionType"},"id":88},{"id":251,"kind":"def","name":"G","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":245,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"app","opcode":"and","args":[{"id":247,"kind":"app","opcode":"F","args":[{"id":246,"kind":"name","name":"x"}]},{"id":249,"kind":"app","opcode":"not","args":[{"id":248,"kind":"name","name":"x"}]}]}}},{"id":258,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":258,"kind":"lambda","params":[{"id":252,"name":"x"}],"qualifier":"def","expr":{"id":257,"kind":"app","opcode":"and","args":[{"id":254,"kind":"app","opcode":"F","args":[{"id":253,"kind":"name","name":"x"}]},{"id":256,"kind":"app","opcode":"not","args":[{"id":255,"kind":"name","name":"x"}]}]}}},{"id":265,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":265,"kind":"lambda","params":[{"id":259,"name":"x"}],"qualifier":"def","expr":{"id":264,"kind":"app","opcode":"or","args":[{"id":261,"kind":"app","opcode":"F","args":[{"id":260,"kind":"name","name":"x"}]},{"id":263,"kind":"app","opcode":"not","args":[{"id":262,"kind":"name","name":"x"}]}]}}},{"id":355,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":354,"kind":"app","opcode":"map","args":[{"id":338,"kind":"app","opcode":"tuples","args":[{"id":336,"kind":"name","name":"S"},{"id":337,"kind":"name","name":"MySet"}]},{"id":353,"kind":"lambda","params":[{"id":344,"name":"quintTupledLambdaParam344"}],"qualifier":"def","expr":{"id":349,"kind":"let","opdef":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]}},"expr":{"id":345,"kind":"let","opdef":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]}},"expr":{"id":343,"kind":"app","opcode":"iadd","args":[{"id":341,"kind":"name","name":"s"},{"id":342,"kind":"name","name":"mys"}]}}}}]}},{"id":367,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":366,"kind":"let","opdef":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]}},"expr":{"id":365,"kind":"app","opcode":"actionAll","args":[{"id":361,"kind":"app","opcode":"igt","args":[{"id":359,"kind":"name","name":"x"},{"id":360,"kind":"int","value":10}]},{"id":364,"kind":"app","opcode":"assign","args":[{"id":363,"kind":"name","name":"k"},{"id":362,"kind":"name","name":"x"}]}]}}}]}],"table":{"68":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"71":{"id":70,"name":"__CircleParam","kind":"param"},"77":{"id":76,"name":"__RectangleParam","kind":"param"},"83":{"id":82,"name":"__DogParam","kind":"param"},"87":{"id":68,"name":"MyUnionType","kind":"typedef","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}}},"156":{"id":155,"name":"x","kind":"param"},"167":{"id":166,"kind":"typedef","name":"PROC"},"177":{"id":175,"name":"x","kind":"param"},"178":{"id":176,"name":"y","kind":"param"},"182":{"id":181,"name":"factor","kind":"param"},"183":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"187":{"id":186,"name":"x","kind":"param"},"188":{"kind":"var","name":"n","typeAnnotation":{"id":171,"kind":"int"},"id":172},"192":{"id":191,"name":"x","kind":"param"},"201":{"id":195,"name":"x","kind":"param"},"202":{"id":196,"name":"y","kind":"param"},"209":{"id":205,"name":"x","kind":"param"},"214":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"222":{"id":217,"name":"x","kind":"param"},"223":{"id":219,"name":"y","kind":"param"},"225":{"id":217,"name":"x","kind":"param"},"226":{"id":219,"name":"y","kind":"param"},"243":{"id":242,"name":"x","kind":"param"},"246":{"id":245,"name":"x","kind":"param"},"247":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"248":{"id":245,"name":"x","kind":"param"},"253":{"id":252,"name":"x","kind":"param"},"254":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"255":{"id":252,"name":"x","kind":"param"},"260":{"id":259,"name":"x","kind":"param"},"261":{"id":244,"kind":"def","name":"F","qualifier":"def","expr":{"id":244,"kind":"lambda","params":[{"id":242,"name":"x"}],"qualifier":"def","expr":{"id":243,"kind":"name","name":"x"}},"depth":0},"262":{"id":259,"name":"x","kind":"param"},"293":{"id":291,"name":"x","kind":"param"},"296":{"id":292,"name":"y","kind":"param"},"299":{"id":292,"name":"y","kind":"param"},"308":{"kind":"var","name":"f1","typeAnnotation":{"id":306,"kind":"fun","arg":{"id":304,"kind":"str"},"res":{"id":305,"kind":"int"}},"id":307},"318":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"322":{"id":315,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":315,"kind":"lambda","params":[{"id":312,"name":"a"},{"id":313,"name":"b"}],"qualifier":"def","expr":{"id":314,"kind":"int","value":1}},"depth":0},"328":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"330":{"id":329,"name":"x","kind":"param"},"336":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"337":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19},"341":{"id":339,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":346,"kind":"app","opcode":"item","args":[{"id":347,"kind":"name","name":"quintTupledLambdaParam344"},{"id":348,"kind":"int","value":1}]},"depth":1},"342":{"id":340,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":350,"kind":"app","opcode":"item","args":[{"id":351,"kind":"name","name":"quintTupledLambdaParam344"},{"id":352,"kind":"int","value":2}]},"depth":1},"347":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"351":{"id":344,"name":"quintTupledLambdaParam344","kind":"param"},"356":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"359":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"362":{"id":358,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":357,"kind":"app","opcode":"oneOf","args":[{"id":356,"kind":"name","name":"S"}]},"depth":1},"363":{"kind":"var","name":"k","typeAnnotation":{"id":211,"kind":"int"},"id":212},"368":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"374":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"376":{"id":375,"name":"x","kind":"param"},"382":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16},"440":{"id":429,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"Rec","args":[{"id":425,"kind":"str","value":"name"},{"id":424,"kind":"str","value":"igor"},{"id":427,"kind":"str","value":"year"},{"id":426,"kind":"int","value":1981}]},"depth":0},"455":{"id":454,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":453,"kind":"app","opcode":"Rec","args":[{"id":450,"kind":"str","value":"a"},{"id":449,"kind":"int","value":1},{"id":452,"kind":"str","value":"b"},{"id":451,"kind":"str","value":"foo"}]},"depth":1},"464":{"id":463,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":462,"kind":"app","opcode":"Tup","args":[{"id":460,"kind":"str","value":"a"},{"id":461,"kind":"int","value":3}]},"depth":1},"470":{"id":469,"name":"s","kind":"param"},"491":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"495":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"505":{"id":503,"kind":"typedef","name":"INT_SET","type":{"id":502,"kind":"set","elem":{"id":501,"kind":"int"}}},"507":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13},"508":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":507,"importedFrom":{"id":509,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":508,"name":"N"},{"id":507,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"Proto","declarations":[{"kind":"var","name":"x","typeAnnotation":{"id":9,"kind":"int"},"id":10,"depth":0},{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":8,"depth":0}]},{"id":3,"name":"M1","declarations":[{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4}}]},{"id":6,"name":"M2","declarations":[{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4}}]},{"id":524,"name":"withConsts","declarations":[{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]}},{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]}},{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]}},{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]}},{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]}},{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]}},{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]}},{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]}},{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]}},{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]}},{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]}},{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]}},{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]}},{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]}},{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}}},{"id":167,"kind":"typedef","name":"PROC","depth":0},{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42}},{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},{"kind":"const","name":"MySeq","typeAnnotation":{"id":21,"kind":"list","elem":{"id":20,"kind":"bool"}},"id":22,"depth":0},{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]}},{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]}},{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]}},{"kind":"const","name":"MyFun","typeAnnotation":{"id":25,"kind":"fun","arg":{"id":23,"kind":"int"},"res":{"id":24,"kind":"str"}},"id":26,"depth":0},{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]}},{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]}},{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]}},{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]}},{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]}},{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},{"kind":"const","name":"MyFunFun","typeAnnotation":{"id":31,"kind":"fun","arg":{"id":29,"kind":"fun","arg":{"id":27,"kind":"int"},"res":{"id":28,"kind":"str"}},"res":{"id":30,"kind":"bool"}},"id":32,"depth":0},{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}}},{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]}},{"kind":"const","name":"MyOperator","typeAnnotation":{"id":36,"kind":"oper","args":[{"id":33,"kind":"int"},{"id":34,"kind":"str"}],"res":{"id":35,"kind":"bool"}},"id":37,"depth":0},{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]}},{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]}},{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]}},{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]}},{"kind":"const","name":"MyOperatorWithComma","typeAnnotation":{"id":41,"kind":"oper","args":[{"id":38,"kind":"int"},{"id":39,"kind":"str"}],"res":{"id":40,"kind":"bool"}},"id":42,"depth":0},{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]}},{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]}},{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]}},{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]}},{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]}},{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]}},{"kind":"const","name":"MyTuple","typeAnnotation":{"id":46,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":43,"kind":"int"}},{"fieldName":"1","fieldType":{"id":44,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":45,"kind":"str"}}],"other":{"kind":"empty"}}},"id":47,"depth":0},{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]}},{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]}},{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]}},{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},{"id":518,"kind":"typedef","name":"UNINTERPRETED_TYPE","depth":0},{"kind":"const","name":"MyTupleWithComma","typeAnnotation":{"id":51,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":48,"kind":"int"}},{"fieldName":"1","fieldType":{"id":49,"kind":"bool"}},{"fieldName":"2","fieldType":{"id":50,"kind":"str"}}],"other":{"kind":"empty"}}},"id":52,"depth":0},{"kind":"const","name":"MyRecord","typeAnnotation":{"id":56,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":53,"kind":"int"}},{"fieldName":"b","fieldType":{"id":54,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":55,"kind":"str"}}],"other":{"kind":"empty"}}},"id":57,"depth":0},{"kind":"const","name":"MyRecordWithComma","typeAnnotation":{"id":61,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"i","fieldType":{"id":58,"kind":"int"}},{"fieldName":"b","fieldType":{"id":59,"kind":"bool"}},{"fieldName":"s","fieldType":{"id":60,"kind":"str"}}],"other":{"kind":"empty"}}},"id":62,"depth":0},{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"kind":"var","name":"i","typeAnnotation":{"id":90,"kind":"int"},"id":91,"depth":0},{"kind":"var","name":"j","typeAnnotation":{"id":92,"kind":"bool"},"id":93,"depth":0},{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]}},{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]}},{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}}},{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}}},{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}}},{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}}},{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}}},{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}}},{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}}},{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]}},{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}}},{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}}},{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}}},{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]}},{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]}},{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]}},{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]}},{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]}},{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]}},{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]}},{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]}},{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}}},{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}}},{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}}},{"id":508,"kind":"assume","name":"positive","assumption":{"id":507,"kind":"app","opcode":"igt","args":[{"id":505,"kind":"name","name":"N"},{"id":506,"kind":"int","value":0}]},"depth":0},{"id":512,"kind":"assume","name":"_","assumption":{"id":511,"kind":"app","opcode":"neq","args":[{"id":509,"kind":"name","name":"N"},{"id":510,"kind":"int","value":0}]}},{"id":513,"kind":"import","defName":"foo","protoName":"M1"},{"id":514,"kind":"import","defName":"*","protoName":"M2"},{"kind":"var","name":"S1","typeAnnotation":{"id":519,"kind":"const","name":"INT_SET"},"id":520,"depth":0},{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}}},{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}}},{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}}},{"kind":"const","name":"MyUnion","typeAnnotation":{"id":88,"kind":"const","name":"MyUnionType"},"id":89,"depth":0},{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}}},{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}}},{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}}},{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]}},{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}}}]}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"val","expr":{"id":1,"kind":"int","value":4},"depth":0},"5":{"id":5,"kind":"def","name":"bar","qualifier":"val","expr":{"id":4,"kind":"int","value":4},"depth":0},"69":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"72":{"id":71,"name":"__CircleParam","kind":"param","depth":1},"75":{"id":75,"kind":"def","name":"Circle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":63,"kind":"int"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":74,"kind":"lambda","params":[{"id":71,"name":"__CircleParam"}],"qualifier":"def","expr":{"id":73,"kind":"app","opcode":"variant","args":[{"id":70,"kind":"str","value":"Circle"},{"kind":"name","name":"__CircleParam","id":72}]}},"depth":0},"78":{"id":77,"name":"__RectangleParam","kind":"param","depth":1},"81":{"id":81,"kind":"def","name":"Rectangle","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":80,"kind":"lambda","params":[{"id":77,"name":"__RectangleParam"}],"qualifier":"def","expr":{"id":79,"kind":"app","opcode":"variant","args":[{"id":76,"kind":"str","value":"Rectangle"},{"kind":"name","name":"__RectangleParam","id":78}]}},"depth":0},"84":{"id":83,"name":"__DogParam","kind":"param","depth":1},"87":{"id":87,"kind":"def","name":"Dog","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":67,"kind":"str"}],"res":{"id":69,"kind":"const","name":"MyUnionType"}},"expr":{"id":86,"kind":"lambda","params":[{"id":83,"name":"__DogParam"}],"qualifier":"def","expr":{"id":85,"kind":"app","opcode":"variant","args":[{"id":82,"kind":"str","value":"Dog"},{"kind":"name","name":"__DogParam","id":84}]}},"depth":0},"88":{"id":68,"kind":"typedef","name":"MyUnionType","type":{"id":68,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Circle","fieldType":{"id":63,"kind":"int"}},{"fieldName":"Rectangle","fieldType":{"id":66,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"width","fieldType":{"id":64,"kind":"int"}},{"fieldName":"height","fieldType":{"id":65,"kind":"int"}}],"other":{"kind":"empty"}}}},{"fieldName":"Dog","fieldType":{"id":67,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"97":{"id":97,"kind":"def","name":"add_1_to_2","qualifier":"val","expr":{"id":96,"kind":"app","opcode":"iadd","args":[{"id":94,"kind":"int","value":1},{"id":95,"kind":"int","value":2}]},"depth":0},"101":{"id":101,"kind":"def","name":"sub_1_to_2","qualifier":"val","expr":{"id":100,"kind":"app","opcode":"isub","args":[{"id":98,"kind":"int","value":1},{"id":99,"kind":"int","value":2}]},"depth":0},"105":{"id":105,"kind":"def","name":"mul_2_to_3","qualifier":"val","expr":{"id":104,"kind":"app","opcode":"imul","args":[{"id":102,"kind":"int","value":2},{"id":103,"kind":"int","value":3}]},"depth":0},"109":{"id":109,"kind":"def","name":"div_2_to_3","qualifier":"val","expr":{"id":108,"kind":"app","opcode":"idiv","args":[{"id":106,"kind":"int","value":2},{"id":107,"kind":"int","value":3}]},"depth":0},"113":{"id":113,"kind":"def","name":"mod_2_to_3","qualifier":"val","expr":{"id":112,"kind":"app","opcode":"imod","args":[{"id":110,"kind":"int","value":2},{"id":111,"kind":"int","value":3}]},"depth":0},"117":{"id":117,"kind":"def","name":"pow_2_to_3","qualifier":"val","expr":{"id":116,"kind":"app","opcode":"ipow","args":[{"id":114,"kind":"int","value":2},{"id":115,"kind":"int","value":3}]},"depth":0},"120":{"id":120,"kind":"def","name":"uminus","qualifier":"val","expr":{"id":119,"kind":"app","opcode":"iuminus","args":[{"id":118,"kind":"int","value":100}]},"depth":0},"124":{"id":124,"kind":"def","name":"gt_2_to_3","qualifier":"val","expr":{"id":123,"kind":"app","opcode":"igt","args":[{"id":121,"kind":"int","value":2},{"id":122,"kind":"int","value":3}]},"depth":0},"128":{"id":128,"kind":"def","name":"ge_2_to_3","qualifier":"val","expr":{"id":127,"kind":"app","opcode":"igte","args":[{"id":125,"kind":"int","value":2},{"id":126,"kind":"int","value":3}]},"depth":0},"132":{"id":132,"kind":"def","name":"lt_2_to_3","qualifier":"val","expr":{"id":131,"kind":"app","opcode":"ilt","args":[{"id":129,"kind":"int","value":2},{"id":130,"kind":"int","value":3}]},"depth":0},"136":{"id":136,"kind":"def","name":"le_2_to_3","qualifier":"val","expr":{"id":135,"kind":"app","opcode":"ilte","args":[{"id":133,"kind":"int","value":2},{"id":134,"kind":"int","value":3}]},"depth":0},"140":{"id":140,"kind":"def","name":"eqeq_2_to_3","qualifier":"val","expr":{"id":139,"kind":"app","opcode":"eq","args":[{"id":137,"kind":"int","value":2},{"id":138,"kind":"int","value":3}]},"depth":0},"144":{"id":144,"kind":"def","name":"ne_2_to_3","qualifier":"val","expr":{"id":143,"kind":"app","opcode":"neq","args":[{"id":141,"kind":"int","value":2},{"id":142,"kind":"int","value":3}]},"depth":0},"150":{"id":150,"kind":"def","name":"VeryTrue","qualifier":"val","expr":{"id":149,"kind":"app","opcode":"eq","args":[{"id":147,"kind":"app","opcode":"iadd","args":[{"id":145,"kind":"int","value":2},{"id":146,"kind":"int","value":2}]},{"id":148,"kind":"int","value":4}]},"depth":0},"154":{"id":154,"kind":"def","name":"nat_includes_one","qualifier":"val","expr":{"id":153,"kind":"app","opcode":"in","args":[{"id":151,"kind":"int","value":1},{"id":152,"kind":"name","name":"Nat"}]},"depth":0},"157":{"id":156,"name":"x","kind":"param","depth":1},"160":{"id":160,"kind":"def","name":"there_is_truth","qualifier":"val","expr":{"id":159,"kind":"app","opcode":"exists","args":[{"id":155,"kind":"name","name":"Bool"},{"id":158,"kind":"lambda","params":[{"id":156,"name":"x"}],"qualifier":"def","expr":{"id":157,"kind":"name","name":"x"}}]},"depth":0},"166":{"id":166,"kind":"def","name":"withType","qualifier":"val","expr":{"id":165,"kind":"app","opcode":"Set","args":[{"id":163,"kind":"int","value":1},{"id":164,"kind":"int","value":2}]},"typeAnnotation":{"id":162,"kind":"set","elem":{"id":161,"kind":"int"}},"depth":0},"168":{"id":167,"kind":"typedef","name":"PROC","depth":0},"171":{"id":171,"kind":"def","name":"withUninterpretedType","qualifier":"val","expr":{"id":170,"kind":"app","opcode":"Set","args":[]},"typeAnnotation":{"id":169,"kind":"set","elem":{"id":168,"kind":"const","name":"PROC"}},"depth":0},"175":{"id":175,"kind":"def","name":"magicNumber","qualifier":"pureval","expr":{"id":174,"kind":"int","value":42},"depth":0},"178":{"id":176,"name":"x","kind":"param","depth":1,"shadowing":false},"179":{"id":177,"name":"y","kind":"param","depth":1},"182":{"id":182,"kind":"def","name":"add","qualifier":"puredef","expr":{"id":181,"kind":"lambda","params":[{"id":176,"name":"x"},{"id":177,"name":"y"}],"qualifier":"puredef","expr":{"id":180,"kind":"app","opcode":"iadd","args":[{"id":178,"kind":"name","name":"x"},{"id":179,"kind":"name","name":"y"}]}},"depth":0},"184":{"id":183,"name":"factor","kind":"param","depth":1},"185":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"188":{"id":188,"kind":"def","name":"ofN","qualifier":"def","expr":{"id":187,"kind":"lambda","params":[{"id":183,"name":"factor"}],"qualifier":"def","expr":{"id":186,"kind":"app","opcode":"imul","args":[{"id":184,"kind":"name","name":"factor"},{"id":185,"kind":"name","name":"n"}]}},"depth":0},"190":{"id":189,"name":"x","kind":"param","depth":1,"shadowing":false},"191":{"kind":"var","name":"n","typeAnnotation":{"id":172,"kind":"int"},"id":173,"depth":0},"194":{"id":194,"kind":"def","name":"A","qualifier":"action","expr":{"id":193,"kind":"lambda","params":[{"id":189,"name":"x"}],"qualifier":"action","expr":{"id":192,"kind":"app","opcode":"assign","args":[{"id":191,"kind":"name","name":"n"},{"id":190,"kind":"name","name":"x"}]}},"depth":0},"196":{"id":195,"name":"x","kind":"param","depth":1,"shadowing":false},"199":{"id":199,"kind":"def","name":"B","qualifier":"puredef","expr":{"id":198,"kind":"lambda","params":[{"id":195,"name":"x"}],"qualifier":"puredef","expr":{"id":197,"kind":"app","opcode":"not","args":[{"id":196,"kind":"name","name":"x"}]}},"depth":0},"206":{"id":200,"name":"x","kind":"param","depth":1,"shadowing":false},"207":{"id":201,"name":"y","kind":"param","depth":1,"shadowing":false},"210":{"id":210,"kind":"def","name":"H","qualifier":"def","expr":{"id":209,"kind":"lambda","params":[{"id":200,"name":"x"},{"id":201,"name":"y"}],"qualifier":"def","expr":{"id":208,"kind":"app","opcode":"iadd","args":[{"id":206,"kind":"name","name":"x"},{"id":207,"kind":"name","name":"y"}]}},"typeAnnotation":{"id":205,"kind":"oper","args":[{"id":202,"kind":"int"},{"id":203,"kind":"int"}],"res":{"id":204,"kind":"int"}},"depth":0},"215":{"id":211,"name":"x","kind":"param","depth":1,"shadowing":false},"217":{"id":217,"kind":"def","name":"Pol","qualifier":"def","expr":{"id":216,"kind":"lambda","params":[{"id":211,"name":"x"}],"qualifier":"def","expr":{"id":215,"kind":"name","name":"x"}},"typeAnnotation":{"id":214,"kind":"oper","args":[{"id":212,"kind":"var","name":"a"}],"res":{"id":213,"kind":"var","name":"a"}},"depth":0},"221":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"223":{"id":223,"kind":"def","name":"asgn","qualifier":"action","expr":{"id":222,"kind":"app","opcode":"assign","args":[{"id":221,"kind":"name","name":"k"},{"id":220,"kind":"int","value":3}]},"depth":0},"229":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"230":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"232":{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"233":{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"},"kind":"param","depth":1,"shadowing":false},"236":{"id":236,"kind":"def","name":"min","qualifier":"puredef","expr":{"id":235,"kind":"lambda","params":[{"id":225,"name":"x","typeAnnotation":{"id":224,"kind":"int"}},{"id":227,"name":"y","typeAnnotation":{"id":226,"kind":"int"}}],"qualifier":"puredef","expr":{"id":234,"kind":"app","opcode":"ite","args":[{"id":231,"kind":"app","opcode":"ilt","args":[{"id":229,"kind":"name","name":"x"},{"id":230,"kind":"name","name":"y"}]},{"id":232,"kind":"name","name":"x"},{"id":233,"kind":"name","name":"y"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":224,"kind":"int"},{"id":226,"kind":"int"}],"res":{"id":228,"kind":"int"}},"depth":0},"240":{"id":240,"kind":"def","name":"test_and","qualifier":"val","expr":{"id":239,"kind":"app","opcode":"and","args":[{"id":237,"kind":"bool","value":false},{"id":238,"kind":"bool","value":true}]},"depth":0},"244":{"id":244,"kind":"def","name":"test_or","qualifier":"val","expr":{"id":243,"kind":"app","opcode":"or","args":[{"id":241,"kind":"bool","value":false},{"id":242,"kind":"bool","value":true}]},"depth":0},"248":{"id":248,"kind":"def","name":"test_implies","qualifier":"val","expr":{"id":247,"kind":"app","opcode":"implies","args":[{"id":245,"kind":"bool","value":false},{"id":246,"kind":"bool","value":true}]},"depth":0},"250":{"id":249,"name":"x","kind":"param","depth":1,"shadowing":false},"252":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"254":{"id":253,"name":"x","kind":"param","depth":1,"shadowing":false},"255":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"256":{"id":253,"name":"x","kind":"param","depth":1,"shadowing":false},"260":{"id":260,"kind":"def","name":"G","qualifier":"def","expr":{"id":259,"kind":"lambda","params":[{"id":253,"name":"x"}],"qualifier":"def","expr":{"id":258,"kind":"app","opcode":"and","args":[{"id":255,"kind":"app","opcode":"F","args":[{"id":254,"kind":"name","name":"x"}]},{"id":257,"kind":"app","opcode":"not","args":[{"id":256,"kind":"name","name":"x"}]}]}},"depth":0},"262":{"id":261,"name":"x","kind":"param","depth":1,"shadowing":false},"263":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"264":{"id":261,"name":"x","kind":"param","depth":1,"shadowing":false},"268":{"id":268,"kind":"def","name":"test_and_arg","qualifier":"def","expr":{"id":267,"kind":"lambda","params":[{"id":261,"name":"x"}],"qualifier":"def","expr":{"id":266,"kind":"app","opcode":"and","args":[{"id":263,"kind":"app","opcode":"F","args":[{"id":262,"kind":"name","name":"x"}]},{"id":265,"kind":"app","opcode":"not","args":[{"id":264,"kind":"name","name":"x"}]}]}},"depth":0},"270":{"id":269,"name":"x","kind":"param","depth":1,"shadowing":false},"271":{"id":252,"kind":"def","name":"F","qualifier":"def","expr":{"id":251,"kind":"lambda","params":[{"id":249,"name":"x"}],"qualifier":"def","expr":{"id":250,"kind":"name","name":"x"}},"depth":0},"272":{"id":269,"name":"x","kind":"param","depth":1,"shadowing":false},"276":{"id":276,"kind":"def","name":"test_or_arg","qualifier":"def","expr":{"id":275,"kind":"lambda","params":[{"id":269,"name":"x"}],"qualifier":"def","expr":{"id":274,"kind":"app","opcode":"or","args":[{"id":271,"kind":"app","opcode":"F","args":[{"id":270,"kind":"name","name":"x"}]},{"id":273,"kind":"app","opcode":"not","args":[{"id":272,"kind":"name","name":"x"}]}]}},"depth":0},"281":{"id":281,"kind":"def","name":"test_block_and","qualifier":"val","expr":{"id":280,"kind":"app","opcode":"and","args":[{"id":277,"kind":"bool","value":false},{"id":278,"kind":"bool","value":true},{"id":279,"kind":"bool","value":false}]},"depth":0},"286":{"id":286,"kind":"def","name":"test_action_and","qualifier":"action","expr":{"id":285,"kind":"app","opcode":"actionAll","args":[{"id":282,"kind":"bool","value":false},{"id":283,"kind":"bool","value":true},{"id":284,"kind":"bool","value":false}]},"depth":0},"291":{"id":291,"kind":"def","name":"test_block_or","qualifier":"val","expr":{"id":290,"kind":"app","opcode":"or","args":[{"id":287,"kind":"bool","value":false},{"id":288,"kind":"bool","value":true},{"id":289,"kind":"bool","value":false}]},"depth":0},"296":{"id":296,"kind":"def","name":"test_action_or","qualifier":"action","expr":{"id":295,"kind":"app","opcode":"actionAny","args":[{"id":292,"kind":"bool","value":false},{"id":293,"kind":"bool","value":true},{"id":294,"kind":"bool","value":false}]},"depth":0},"301":{"id":301,"kind":"def","name":"test_ite","qualifier":"val","expr":{"id":300,"kind":"app","opcode":"ite","args":[{"id":297,"kind":"bool","value":true},{"id":298,"kind":"int","value":1},{"id":299,"kind":"int","value":0}]},"depth":0},"304":{"id":302,"name":"x","kind":"param","depth":1,"shadowing":false},"307":{"id":303,"name":"y","kind":"param","depth":1,"shadowing":false},"310":{"id":303,"name":"y","kind":"param","depth":1,"shadowing":false},"315":{"id":315,"kind":"def","name":"test_ite2","qualifier":"def","expr":{"id":314,"kind":"lambda","params":[{"id":302,"name":"x"},{"id":303,"name":"y"}],"qualifier":"def","expr":{"id":313,"kind":"app","opcode":"ite","args":[{"id":306,"kind":"app","opcode":"ilt","args":[{"id":304,"kind":"name","name":"x"},{"id":305,"kind":"int","value":10}]},{"id":309,"kind":"app","opcode":"iadd","args":[{"id":307,"kind":"name","name":"y"},{"id":308,"kind":"int","value":5}]},{"id":312,"kind":"app","opcode":"imod","args":[{"id":310,"kind":"name","name":"y"},{"id":311,"kind":"int","value":5}]}]}},"depth":0},"320":{"kind":"var","name":"f1","typeAnnotation":{"id":318,"kind":"fun","arg":{"id":316,"kind":"str"},"res":{"id":317,"kind":"int"}},"id":319,"depth":0},"323":{"id":323,"kind":"def","name":"funapp","qualifier":"val","expr":{"id":322,"kind":"app","opcode":"get","args":[{"id":320,"kind":"name","name":"f1"},{"id":321,"kind":"str","value":"a"}]},"depth":0},"328":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"331":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"332":{"id":332,"kind":"def","name":"oper_app_normal","qualifier":"val","expr":{"id":331,"kind":"app","opcode":"MyOper","args":[{"id":329,"kind":"str","value":"a"},{"id":330,"kind":"int","value":42}]},"depth":0},"335":{"id":328,"kind":"def","name":"MyOper","qualifier":"def","expr":{"id":327,"kind":"lambda","params":[{"id":324,"name":"a"},{"id":325,"name":"b"}],"qualifier":"def","expr":{"id":326,"kind":"int","value":1}},"depth":0},"336":{"id":336,"kind":"def","name":"oper_app_ufcs","qualifier":"val","expr":{"id":335,"kind":"app","opcode":"MyOper","args":[{"id":333,"kind":"str","value":"a"},{"id":334,"kind":"int","value":42}]},"depth":0},"340":{"id":340,"kind":"def","name":"oper_in","qualifier":"val","expr":{"id":339,"kind":"app","opcode":"in","args":[{"id":337,"kind":"int","value":1},{"id":338,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"341":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"343":{"id":342,"name":"x","kind":"param","depth":1,"shadowing":false},"348":{"id":348,"kind":"def","name":"oper_app_dot1","qualifier":"val","expr":{"id":347,"kind":"app","opcode":"filter","args":[{"id":341,"kind":"name","name":"S"},{"id":346,"kind":"lambda","params":[{"id":342,"name":"x"}],"qualifier":"def","expr":{"id":345,"kind":"app","opcode":"igt","args":[{"id":343,"kind":"name","name":"x"},{"id":344,"kind":"int","value":10}]}}]},"depth":0},"349":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"350":{"kind":"const","name":"MySet","typeAnnotation":{"id":18,"kind":"set","elem":{"id":17,"kind":"int"}},"id":19,"depth":0},"352":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":4},"353":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":3},"354":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]},"depth":4},"355":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]},"depth":3},"360":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"364":{"id":357,"name":"quintTupledLambdaParam357","kind":"param","depth":1},"368":{"id":368,"kind":"def","name":"tuple_sum","qualifier":"val","expr":{"id":367,"kind":"app","opcode":"map","args":[{"id":351,"kind":"app","opcode":"tuples","args":[{"id":349,"kind":"name","name":"S"},{"id":350,"kind":"name","name":"MySet"}]},{"id":366,"kind":"lambda","params":[{"id":357,"name":"quintTupledLambdaParam357"}],"qualifier":"def","expr":{"id":362,"kind":"let","opdef":{"id":353,"kind":"def","name":"mys","qualifier":"pureval","expr":{"id":363,"kind":"app","opcode":"item","args":[{"id":364,"kind":"name","name":"quintTupledLambdaParam357"},{"id":365,"kind":"int","value":2}]}},"expr":{"id":358,"kind":"let","opdef":{"id":352,"kind":"def","name":"s","qualifier":"pureval","expr":{"id":359,"kind":"app","opcode":"item","args":[{"id":360,"kind":"name","name":"quintTupledLambdaParam357"},{"id":361,"kind":"int","value":1}]}},"expr":{"id":356,"kind":"app","opcode":"iadd","args":[{"id":354,"kind":"name","name":"s"},{"id":355,"kind":"name","name":"mys"}]}}}}]},"depth":0},"369":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"371":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"372":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"375":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]},"depth":2,"shadowing":false},"376":{"kind":"var","name":"k","typeAnnotation":{"id":218,"kind":"int"},"id":219,"depth":0},"380":{"id":380,"kind":"def","name":"oper_nondet","qualifier":"action","expr":{"id":379,"kind":"let","opdef":{"id":371,"kind":"def","name":"x","qualifier":"nondet","expr":{"id":370,"kind":"app","opcode":"oneOf","args":[{"id":369,"kind":"name","name":"S"}]}},"expr":{"id":378,"kind":"app","opcode":"actionAll","args":[{"id":374,"kind":"app","opcode":"igt","args":[{"id":372,"kind":"name","name":"x"},{"id":373,"kind":"int","value":10}]},{"id":377,"kind":"app","opcode":"assign","args":[{"id":376,"kind":"name","name":"k"},{"id":375,"kind":"name","name":"x"}]}]}},"depth":0},"381":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"386":{"id":386,"kind":"def","name":"oper_app_dot4","qualifier":"val","expr":{"id":385,"kind":"app","opcode":"filter","args":[{"id":381,"kind":"name","name":"S"},{"id":384,"kind":"lambda","params":[{"id":382,"name":"_"}],"qualifier":"def","expr":{"id":383,"kind":"bool","value":true}}]},"depth":0},"387":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"389":{"id":388,"name":"x","kind":"param","depth":1,"shadowing":false},"394":{"id":394,"kind":"def","name":"f","qualifier":"val","expr":{"id":393,"kind":"app","opcode":"mapBy","args":[{"id":387,"kind":"name","name":"S"},{"id":392,"kind":"lambda","params":[{"id":388,"name":"x"}],"qualifier":"def","expr":{"id":391,"kind":"app","opcode":"iadd","args":[{"id":389,"kind":"name","name":"x"},{"id":390,"kind":"int","value":1}]}}]},"depth":0},"395":{"kind":"const","name":"S","typeAnnotation":{"id":15,"kind":"set","elem":{"id":14,"kind":"int"}},"id":16,"depth":0},"400":{"id":400,"kind":"def","name":"set_difference","qualifier":"val","expr":{"id":399,"kind":"app","opcode":"exclude","args":[{"id":395,"kind":"name","name":"S"},{"id":398,"kind":"app","opcode":"Set","args":[{"id":396,"kind":"int","value":3},{"id":397,"kind":"int","value":4}]}]},"depth":0},"405":{"id":405,"kind":"def","name":"one","qualifier":"val","expr":{"id":404,"kind":"app","opcode":"head","args":[{"id":403,"kind":"app","opcode":"List","args":[{"id":401,"kind":"int","value":1},{"id":402,"kind":"int","value":2}]}]},"depth":0},"410":{"id":410,"kind":"def","name":"test_tuple","qualifier":"val","expr":{"id":409,"kind":"app","opcode":"Tup","args":[{"id":406,"kind":"int","value":1},{"id":407,"kind":"int","value":2},{"id":408,"kind":"int","value":3}]},"depth":0},"415":{"id":415,"kind":"def","name":"test_tuple2","qualifier":"val","expr":{"id":414,"kind":"app","opcode":"Tup","args":[{"id":411,"kind":"int","value":1},{"id":412,"kind":"int","value":2},{"id":413,"kind":"int","value":3}]},"depth":0},"419":{"id":419,"kind":"def","name":"test_pair","qualifier":"val","expr":{"id":418,"kind":"app","opcode":"Tup","args":[{"id":416,"kind":"int","value":4},{"id":417,"kind":"int","value":5}]},"depth":0},"424":{"id":424,"kind":"def","name":"test_list","qualifier":"val","expr":{"id":423,"kind":"app","opcode":"List","args":[{"id":420,"kind":"int","value":1},{"id":421,"kind":"int","value":2},{"id":422,"kind":"int","value":3}]},"depth":0},"429":{"id":429,"kind":"def","name":"test_list2","qualifier":"val","expr":{"id":428,"kind":"app","opcode":"List","args":[{"id":425,"kind":"int","value":1},{"id":426,"kind":"int","value":2},{"id":427,"kind":"int","value":3}]},"depth":0},"436":{"id":436,"kind":"def","name":"test_list_nth","qualifier":"val","expr":{"id":435,"kind":"app","opcode":"nth","args":[{"id":433,"kind":"app","opcode":"List","args":[{"id":430,"kind":"int","value":2},{"id":431,"kind":"int","value":3},{"id":432,"kind":"int","value":4}]},{"id":434,"kind":"int","value":2}]},"depth":0},"442":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"448":{"id":448,"kind":"def","name":"test_record2","qualifier":"val","expr":{"id":447,"kind":"app","opcode":"Rec","args":[{"id":443,"kind":"str","value":"name"},{"id":444,"kind":"str","value":"igor"},{"id":445,"kind":"str","value":"year"},{"id":446,"kind":"int","value":1981}]},"depth":0},"453":{"id":442,"kind":"def","name":"test_record","qualifier":"val","expr":{"id":441,"kind":"app","opcode":"Rec","args":[{"id":438,"kind":"str","value":"name"},{"id":437,"kind":"str","value":"igor"},{"id":440,"kind":"str","value":"year"},{"id":439,"kind":"int","value":1981}]},"depth":0},"456":{"id":456,"kind":"def","name":"test_record3","qualifier":"val","expr":{"id":455,"kind":"app","opcode":"with","args":[{"id":454,"kind":"app","opcode":"with","args":[{"id":453,"kind":"name","name":"test_record"},{"id":450,"kind":"str","value":"name"},{"id":449,"kind":"str","value":"quint"}]},{"id":452,"kind":"str","value":"year"},{"id":451,"kind":"int","value":2023}]},"depth":0},"461":{"id":461,"kind":"def","name":"test_set","qualifier":"val","expr":{"id":460,"kind":"app","opcode":"Set","args":[{"id":457,"kind":"int","value":1},{"id":458,"kind":"int","value":2},{"id":459,"kind":"int","value":3}]},"depth":0},"467":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":2},"468":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]},"depth":2},"472":{"id":472,"kind":"def","name":"rec_field","qualifier":"val","expr":{"id":471,"kind":"let","opdef":{"id":467,"kind":"def","name":"my_rec","qualifier":"val","expr":{"id":466,"kind":"app","opcode":"Rec","args":[{"id":463,"kind":"str","value":"a"},{"id":462,"kind":"int","value":1},{"id":465,"kind":"str","value":"b"},{"id":464,"kind":"str","value":"foo"}]}},"expr":{"id":470,"kind":"app","opcode":"field","args":[{"id":468,"kind":"name","name":"my_rec"},{"id":469,"kind":"str","value":"a"}]}},"depth":0},"476":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":2},"477":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]},"depth":2},"481":{"id":481,"kind":"def","name":"tup_elem","qualifier":"val","expr":{"id":480,"kind":"let","opdef":{"id":476,"kind":"def","name":"my_tup","qualifier":"val","expr":{"id":475,"kind":"app","opcode":"Tup","args":[{"id":473,"kind":"str","value":"a"},{"id":474,"kind":"int","value":3}]}},"expr":{"id":479,"kind":"app","opcode":"item","args":[{"id":477,"kind":"name","name":"my_tup"},{"id":478,"kind":"int","value":2}]}},"depth":0},"483":{"id":482,"name":"s","kind":"param","depth":1,"shadowing":false},"487":{"id":487,"kind":"def","name":"isEmpty","qualifier":"def","expr":{"id":486,"kind":"lambda","params":[{"id":482,"name":"s"}],"qualifier":"def","expr":{"id":485,"kind":"app","opcode":"eq","args":[{"id":483,"kind":"name","name":"s"},{"id":484,"kind":"app","opcode":"List","args":[]}]}},"depth":0},"491":{"id":491,"kind":"def","name":"in_2_empty","qualifier":"val","expr":{"id":490,"kind":"app","opcode":"in","args":[{"id":488,"kind":"int","value":2},{"id":489,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"495":{"id":495,"kind":"def","name":"subseteq_empty","qualifier":"val","expr":{"id":494,"kind":"app","opcode":"subseteq","args":[{"id":492,"kind":"app","opcode":"Set","args":[]},{"id":493,"kind":"app","opcode":"Set","args":[]}]},"depth":0},"504":{"id":504,"kind":"def","name":"powersets","qualifier":"val","expr":{"id":503,"kind":"app","opcode":"in","args":[{"id":497,"kind":"app","opcode":"Set","args":[{"id":496,"kind":"int","value":1}]},{"id":502,"kind":"app","opcode":"powerset","args":[{"id":501,"kind":"app","opcode":"Set","args":[{"id":498,"kind":"int","value":1},{"id":499,"kind":"int","value":2},{"id":500,"kind":"int","value":3}]}]}]},"depth":0},"505":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"509":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"519":{"id":517,"kind":"typedef","name":"INT_SET","type":{"id":516,"kind":"set","elem":{"id":515,"kind":"int"}},"depth":0},"521":{"kind":"const","name":"N","typeAnnotation":{"id":12,"kind":"int"},"id":13,"depth":0},"522":{"kind":"const","name":"N","typeAnnotation":{"id":7,"kind":"int"},"id":521,"depth":0,"importedFrom":{"id":523,"kind":"instance","qualifiedName":"Inst1","protoName":"Proto","overrides":[[{"id":522,"name":"N"},{"id":521,"kind":"name","name":"N"}]],"identityOverride":false},"hidden":true,"namespaces":["Inst1","withConsts"]}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/SuperSpec.map.json b/quint/testFixture/SuperSpec.map.json index 54d6d710d..789c2de56 100644 --- a/quint/testFixture/SuperSpec.map.json +++ b/quint/testFixture/SuperSpec.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"70":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"71":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"76":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"77":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"82":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"83":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"88":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"89":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"90":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"91":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"92":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"93":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"94":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"95":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"97":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"98":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"99":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"101":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"102":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"103":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"105":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"106":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"107":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"109":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"110":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"111":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"113":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"114":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"115":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"117":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"118":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"120":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"121":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"122":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"124":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"125":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"126":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"128":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"129":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"130":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"132":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"133":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"134":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"136":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"137":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"138":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"140":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"141":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"142":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"144":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"145":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"146":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"148":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"149":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"150":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"151":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"152":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"153":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"154":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"155":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"156":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"157":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"159":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"160":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"161":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"162":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"163":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"164":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"165":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"166":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"167":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"168":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"169":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"170":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"171":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"172":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"173":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"174":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"175":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"176":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"177":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"178":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"179":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"181":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"182":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"183":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"185":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"186":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"187":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"188":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"189":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"190":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"191":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"192":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"193":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"194":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"195":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"196":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"197":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"198":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"199":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"200":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"201":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"202":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"203":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"204":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"205":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"206":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"207":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"208":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"209":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"210":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"211":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"212":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"213":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"214":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"215":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"216":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"217":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":15,"index":2113}],"218":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"219":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":23,"index":2121}],"220":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"221":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"222":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"223":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"224":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"225":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"226":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"227":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"228":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"229":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"230":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"231":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"232":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"233":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"234":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"235":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"236":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"237":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"238":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"239":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"240":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"241":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"242":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"243":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"244":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"245":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"246":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"247":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"248":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"249":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"250":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"251":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"252":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"253":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"254":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"255":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"256":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"257":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"258":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"259":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"260":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"261":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"262":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"263":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"264":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"265":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"266":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"267":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"268":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"269":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"270":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"271":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"272":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"273":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"274":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"275":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"276":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"277":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"278":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"279":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"280":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"281":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"282":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"283":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"284":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"285":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"286":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"287":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"288":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"289":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"290":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"291":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"292":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"293":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"294":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"295":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"296":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"297":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"298":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"299":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"300":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"301":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"302":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"303":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"304":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"305":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"306":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"307":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"308":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"309":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"310":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"311":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"312":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"313":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"314":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"315":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"316":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"317":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"318":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"319":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"320":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"321":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"322":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"323":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"324":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"325":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"326":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"327":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"328":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"329":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"330":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"331":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"332":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"333":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"334":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"335":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"336":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"337":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"338":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"339":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"340":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"341":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"342":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"343":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"344":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"345":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"346":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"347":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"348":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"349":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"350":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"351":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"352":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"353":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"354":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"355":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"356":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"357":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"358":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"359":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"360":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"361":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"362":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"363":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"364":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"365":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"366":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"367":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"368":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"369":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"370":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"371":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"372":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"373":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"374":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"375":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"376":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"377":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"378":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"379":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"380":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"381":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"382":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"383":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"384":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"385":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"386":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"387":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"388":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"389":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"390":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"391":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"392":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"393":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"394":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"395":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"396":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"397":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"398":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"399":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"400":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"401":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"402":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"403":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"404":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"405":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"406":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"407":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"408":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"409":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"410":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"411":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"412":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"413":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"414":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"415":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"416":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"417":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"418":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"419":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"420":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"421":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"422":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"423":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"424":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"425":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"426":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"427":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"428":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"429":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"430":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"431":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"432":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"433":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"434":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"435":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"436":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"437":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"438":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"439":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"440":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"441":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"442":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"443":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"444":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"445":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"446":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"447":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"448":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"449":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"450":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"451":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"452":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"453":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"454":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"455":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"456":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"457":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"458":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"459":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"460":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"461":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"462":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"463":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"464":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"465":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"466":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"467":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"468":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"469":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"470":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"471":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"472":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"473":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"474":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"475":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"476":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"477":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"478":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"479":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"480":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"481":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"482":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"483":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"484":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"485":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"486":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"487":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"488":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"489":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"490":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"491":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"492":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"493":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"494":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"495":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"496":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"497":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"498":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"499":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"500":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"501":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"502":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"503":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"504":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"505":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"506":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"507":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"508":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"509":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"510":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/SuperSpec.qnt"},"map":{"1":[0,{"line":1,"col":12,"index":24},{"line":1,"col":12,"index":24}],"2":[0,{"line":1,"col":2,"index":14},{"line":1,"col":12,"index":24}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":26,"index":26}],"4":[0,{"line":5,"col":12,"index":53},{"line":5,"col":12,"index":53}],"5":[0,{"line":5,"col":2,"index":43},{"line":5,"col":12,"index":53}],"6":[0,{"line":4,"col":0,"index":29},{"line":6,"col":26,"index":55}],"7":[0,{"line":9,"col":11,"index":84},{"line":9,"col":13,"index":86}],"8":[0,{"line":9,"col":2,"index":75},{"line":9,"col":13,"index":86}],"9":[0,{"line":10,"col":9,"index":97},{"line":10,"col":11,"index":99}],"10":[0,{"line":10,"col":2,"index":90},{"line":10,"col":11,"index":99}],"11":[0,{"line":8,"col":0,"index":58},{"line":11,"col":43,"index":101}],"12":[0,{"line":16,"col":11,"index":186},{"line":16,"col":13,"index":188}],"13":[0,{"line":16,"col":2,"index":177},{"line":16,"col":13,"index":188}],"14":[0,{"line":17,"col":15,"index":205},{"line":17,"col":17,"index":207}],"15":[0,{"line":17,"col":11,"index":201},{"line":17,"col":18,"index":208}],"16":[0,{"line":17,"col":2,"index":192},{"line":17,"col":18,"index":208}],"17":[0,{"line":18,"col":19,"index":229},{"line":18,"col":21,"index":231}],"18":[0,{"line":18,"col":15,"index":225},{"line":18,"col":22,"index":232}],"19":[0,{"line":18,"col":2,"index":212},{"line":18,"col":22,"index":232}],"20":[0,{"line":19,"col":20,"index":254},{"line":19,"col":23,"index":257}],"21":[0,{"line":19,"col":15,"index":249},{"line":19,"col":24,"index":258}],"22":[0,{"line":19,"col":2,"index":236},{"line":19,"col":24,"index":258}],"23":[0,{"line":20,"col":15,"index":275},{"line":20,"col":17,"index":277}],"24":[0,{"line":20,"col":22,"index":282},{"line":20,"col":24,"index":284}],"25":[0,{"line":20,"col":15,"index":275},{"line":20,"col":24,"index":284}],"26":[0,{"line":20,"col":2,"index":262},{"line":20,"col":24,"index":284}],"27":[0,{"line":21,"col":19,"index":305},{"line":21,"col":21,"index":307}],"28":[0,{"line":21,"col":26,"index":312},{"line":21,"col":28,"index":314}],"29":[0,{"line":21,"col":19,"index":305},{"line":21,"col":28,"index":314}],"30":[0,{"line":21,"col":34,"index":320},{"line":21,"col":37,"index":323}],"31":[0,{"line":21,"col":18,"index":304},{"line":21,"col":37,"index":323}],"32":[0,{"line":21,"col":2,"index":288},{"line":21,"col":37,"index":323}],"33":[0,{"line":22,"col":21,"index":346},{"line":22,"col":23,"index":348}],"34":[0,{"line":22,"col":26,"index":351},{"line":22,"col":28,"index":353}],"35":[0,{"line":22,"col":34,"index":359},{"line":22,"col":37,"index":362}],"36":[0,{"line":22,"col":20,"index":345},{"line":22,"col":37,"index":362}],"37":[0,{"line":22,"col":2,"index":327},{"line":22,"col":37,"index":362}],"38":[0,{"line":23,"col":30,"index":394},{"line":23,"col":32,"index":396}],"39":[0,{"line":23,"col":35,"index":399},{"line":23,"col":37,"index":401}],"40":[0,{"line":23,"col":45,"index":409},{"line":23,"col":48,"index":412}],"41":[0,{"line":23,"col":29,"index":393},{"line":23,"col":48,"index":412}],"42":[0,{"line":23,"col":2,"index":366},{"line":23,"col":48,"index":412}],"43":[0,{"line":24,"col":18,"index":432},{"line":24,"col":20,"index":434}],"44":[0,{"line":24,"col":23,"index":437},{"line":24,"col":26,"index":440}],"45":[0,{"line":24,"col":29,"index":443},{"line":24,"col":31,"index":445}],"46":[0,{"line":24,"col":17,"index":431},{"line":24,"col":32,"index":446}],"47":[0,{"line":24,"col":2,"index":416},{"line":24,"col":32,"index":446}],"48":[0,{"line":25,"col":27,"index":475},{"line":25,"col":29,"index":477}],"49":[0,{"line":25,"col":32,"index":480},{"line":25,"col":35,"index":483}],"50":[0,{"line":25,"col":38,"index":486},{"line":25,"col":40,"index":488}],"51":[0,{"line":25,"col":26,"index":474},{"line":25,"col":43,"index":491}],"52":[0,{"line":25,"col":2,"index":450},{"line":25,"col":43,"index":491}],"53":[0,{"line":28,"col":23,"index":580},{"line":28,"col":25,"index":582}],"54":[0,{"line":28,"col":31,"index":588},{"line":28,"col":34,"index":591}],"55":[0,{"line":28,"col":40,"index":597},{"line":28,"col":42,"index":599}],"56":[0,{"line":28,"col":18,"index":575},{"line":28,"col":44,"index":601}],"57":[0,{"line":28,"col":2,"index":559},{"line":28,"col":44,"index":601}],"58":[0,{"line":29,"col":32,"index":635},{"line":29,"col":34,"index":637}],"59":[0,{"line":29,"col":40,"index":643},{"line":29,"col":43,"index":646}],"60":[0,{"line":29,"col":49,"index":652},{"line":29,"col":51,"index":654}],"61":[0,{"line":29,"col":27,"index":630},{"line":29,"col":54,"index":657}],"62":[0,{"line":29,"col":2,"index":605},{"line":29,"col":54,"index":657}],"63":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"64":[0,{"line":34,"col":26,"index":777},{"line":34,"col":28,"index":779}],"65":[0,{"line":34,"col":39,"index":790},{"line":34,"col":41,"index":792}],"66":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"67":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"68":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"69":[0,{"line":32,"col":2,"index":712},{"line":35,"col":102,"index":812}],"70":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"71":[0,{"line":33,"col":15,"index":746},{"line":33,"col":17,"index":748}],"72":[0,{"line":33,"col":8,"index":739},{"line":33,"col":13,"index":744}],"73":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"74":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"75":[0,{"line":33,"col":8,"index":739},{"line":33,"col":18,"index":749}],"76":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"77":[0,{"line":34,"col":18,"index":769},{"line":34,"col":43,"index":794}],"78":[0,{"line":34,"col":8,"index":759},{"line":34,"col":16,"index":767}],"79":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"80":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"81":[0,{"line":34,"col":8,"index":759},{"line":34,"col":44,"index":795}],"82":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"83":[0,{"line":35,"col":12,"index":809},{"line":35,"col":14,"index":811}],"84":[0,{"line":35,"col":8,"index":805},{"line":35,"col":10,"index":807}],"85":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"86":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"87":[0,{"line":35,"col":8,"index":805},{"line":35,"col":15,"index":812}],"88":[0,{"line":36,"col":17,"index":831},{"line":36,"col":27,"index":841}],"89":[0,{"line":36,"col":2,"index":816},{"line":36,"col":27,"index":841}],"90":[0,{"line":41,"col":9,"index":955},{"line":41,"col":11,"index":957}],"91":[0,{"line":41,"col":2,"index":948},{"line":41,"col":11,"index":957}],"92":[0,{"line":42,"col":9,"index":968},{"line":42,"col":12,"index":971}],"93":[0,{"line":42,"col":2,"index":961},{"line":42,"col":12,"index":971}],"94":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":19,"index":1140}],"95":[0,{"line":47,"col":23,"index":1144},{"line":47,"col":23,"index":1144}],"96":[0,{"line":47,"col":19,"index":1140},{"line":47,"col":23,"index":1144}],"97":[0,{"line":47,"col":2,"index":1123},{"line":47,"col":23,"index":1144}],"98":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":19,"index":1165}],"99":[0,{"line":48,"col":23,"index":1169},{"line":48,"col":23,"index":1169}],"100":[0,{"line":48,"col":19,"index":1165},{"line":48,"col":23,"index":1169}],"101":[0,{"line":48,"col":2,"index":1148},{"line":48,"col":23,"index":1169}],"102":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":19,"index":1190}],"103":[0,{"line":49,"col":23,"index":1194},{"line":49,"col":23,"index":1194}],"104":[0,{"line":49,"col":19,"index":1190},{"line":49,"col":23,"index":1194}],"105":[0,{"line":49,"col":2,"index":1173},{"line":49,"col":23,"index":1194}],"106":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":19,"index":1215}],"107":[0,{"line":50,"col":23,"index":1219},{"line":50,"col":23,"index":1219}],"108":[0,{"line":50,"col":19,"index":1215},{"line":50,"col":23,"index":1219}],"109":[0,{"line":50,"col":2,"index":1198},{"line":50,"col":23,"index":1219}],"110":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":19,"index":1240}],"111":[0,{"line":51,"col":23,"index":1244},{"line":51,"col":23,"index":1244}],"112":[0,{"line":51,"col":19,"index":1240},{"line":51,"col":23,"index":1244}],"113":[0,{"line":51,"col":2,"index":1223},{"line":51,"col":23,"index":1244}],"114":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":19,"index":1265}],"115":[0,{"line":52,"col":21,"index":1267},{"line":52,"col":21,"index":1267}],"116":[0,{"line":52,"col":19,"index":1265},{"line":52,"col":21,"index":1267}],"117":[0,{"line":52,"col":2,"index":1248},{"line":52,"col":21,"index":1267}],"118":[0,{"line":53,"col":16,"index":1285},{"line":53,"col":18,"index":1287}],"119":[0,{"line":53,"col":15,"index":1284},{"line":53,"col":18,"index":1287}],"120":[0,{"line":53,"col":2,"index":1271},{"line":53,"col":18,"index":1287}],"121":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":18,"index":1307}],"122":[0,{"line":54,"col":22,"index":1311},{"line":54,"col":22,"index":1311}],"123":[0,{"line":54,"col":18,"index":1307},{"line":54,"col":22,"index":1311}],"124":[0,{"line":54,"col":2,"index":1291},{"line":54,"col":22,"index":1311}],"125":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":18,"index":1331}],"126":[0,{"line":55,"col":23,"index":1336},{"line":55,"col":23,"index":1336}],"127":[0,{"line":55,"col":18,"index":1331},{"line":55,"col":23,"index":1336}],"128":[0,{"line":55,"col":2,"index":1315},{"line":55,"col":23,"index":1336}],"129":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":18,"index":1356}],"130":[0,{"line":56,"col":22,"index":1360},{"line":56,"col":22,"index":1360}],"131":[0,{"line":56,"col":18,"index":1356},{"line":56,"col":22,"index":1360}],"132":[0,{"line":56,"col":2,"index":1340},{"line":56,"col":22,"index":1360}],"133":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":18,"index":1380}],"134":[0,{"line":57,"col":23,"index":1385},{"line":57,"col":23,"index":1385}],"135":[0,{"line":57,"col":18,"index":1380},{"line":57,"col":23,"index":1385}],"136":[0,{"line":57,"col":2,"index":1364},{"line":57,"col":23,"index":1385}],"137":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":20,"index":1407}],"138":[0,{"line":58,"col":25,"index":1412},{"line":58,"col":25,"index":1412}],"139":[0,{"line":58,"col":20,"index":1407},{"line":58,"col":25,"index":1412}],"140":[0,{"line":58,"col":2,"index":1389},{"line":58,"col":25,"index":1412}],"141":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":18,"index":1432}],"142":[0,{"line":59,"col":23,"index":1437},{"line":59,"col":23,"index":1437}],"143":[0,{"line":59,"col":18,"index":1432},{"line":59,"col":23,"index":1437}],"144":[0,{"line":59,"col":2,"index":1416},{"line":59,"col":23,"index":1437}],"145":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":6,"index":1464}],"146":[0,{"line":61,"col":10,"index":1468},{"line":61,"col":10,"index":1468}],"147":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":10,"index":1468}],"148":[0,{"line":61,"col":15,"index":1473},{"line":61,"col":15,"index":1473}],"149":[0,{"line":61,"col":6,"index":1464},{"line":61,"col":15,"index":1473}],"150":[0,{"line":60,"col":2,"index":1441},{"line":62,"col":38,"index":1477}],"151":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":25,"index":1504}],"152":[0,{"line":63,"col":30,"index":1509},{"line":63,"col":32,"index":1511}],"153":[0,{"line":63,"col":25,"index":1504},{"line":63,"col":33,"index":1512}],"154":[0,{"line":63,"col":2,"index":1481},{"line":63,"col":33,"index":1512}],"155":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":26,"index":1540}],"156":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":35,"index":1549}],"157":[0,{"line":64,"col":40,"index":1554},{"line":64,"col":40,"index":1554}],"158":[0,{"line":64,"col":35,"index":1549},{"line":64,"col":40,"index":1554}],"159":[0,{"line":64,"col":23,"index":1537},{"line":64,"col":41,"index":1555}],"160":[0,{"line":64,"col":2,"index":1516},{"line":64,"col":41,"index":1555}],"161":[0,{"line":67,"col":20,"index":1594},{"line":67,"col":22,"index":1596}],"162":[0,{"line":67,"col":16,"index":1590},{"line":67,"col":23,"index":1597}],"163":[0,{"line":67,"col":31,"index":1605},{"line":67,"col":31,"index":1605}],"164":[0,{"line":67,"col":34,"index":1608},{"line":67,"col":34,"index":1608}],"165":[0,{"line":67,"col":27,"index":1601},{"line":67,"col":35,"index":1609}],"166":[0,{"line":67,"col":2,"index":1576},{"line":67,"col":35,"index":1609}],"167":[0,{"line":69,"col":2,"index":1648},{"line":69,"col":10,"index":1656}],"168":[0,{"line":70,"col":33,"index":1691},{"line":70,"col":36,"index":1694}],"169":[0,{"line":70,"col":29,"index":1687},{"line":70,"col":37,"index":1695}],"170":[0,{"line":70,"col":41,"index":1699},{"line":70,"col":45,"index":1703}],"171":[0,{"line":70,"col":2,"index":1660},{"line":70,"col":45,"index":1703}],"172":[0,{"line":73,"col":9,"index":1741},{"line":73,"col":11,"index":1743}],"173":[0,{"line":73,"col":2,"index":1734},{"line":73,"col":11,"index":1743}],"174":[0,{"line":74,"col":25,"index":1770},{"line":74,"col":26,"index":1771}],"175":[0,{"line":74,"col":2,"index":1747},{"line":74,"col":26,"index":1771}],"176":[0,{"line":75,"col":15,"index":1788},{"line":75,"col":15,"index":1788}],"177":[0,{"line":75,"col":18,"index":1791},{"line":75,"col":18,"index":1791}],"178":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":23,"index":1796}],"179":[0,{"line":75,"col":27,"index":1800},{"line":75,"col":27,"index":1800}],"180":[0,{"line":75,"col":23,"index":1796},{"line":75,"col":27,"index":1800}],"181":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"182":[0,{"line":75,"col":2,"index":1775},{"line":75,"col":27,"index":1800}],"183":[0,{"line":76,"col":10,"index":1812},{"line":76,"col":15,"index":1817}],"184":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":25,"index":1827}],"185":[0,{"line":76,"col":29,"index":1831},{"line":76,"col":29,"index":1831}],"186":[0,{"line":76,"col":20,"index":1822},{"line":76,"col":29,"index":1831}],"187":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"188":[0,{"line":76,"col":2,"index":1804},{"line":76,"col":29,"index":1831}],"189":[0,{"line":77,"col":11,"index":1844},{"line":77,"col":11,"index":1844}],"190":[0,{"line":77,"col":21,"index":1854},{"line":77,"col":21,"index":1854}],"191":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"192":[0,{"line":77,"col":16,"index":1849},{"line":77,"col":21,"index":1854}],"193":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"194":[0,{"line":77,"col":2,"index":1835},{"line":77,"col":21,"index":1854}],"195":[0,{"line":78,"col":13,"index":1869},{"line":78,"col":13,"index":1869}],"196":[0,{"line":78,"col":22,"index":1878},{"line":78,"col":22,"index":1878}],"197":[0,{"line":78,"col":18,"index":1874},{"line":78,"col":23,"index":1879}],"198":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"199":[0,{"line":78,"col":2,"index":1858},{"line":78,"col":23,"index":1879}],"200":[0,{"line":81,"col":8,"index":1911},{"line":81,"col":8,"index":1911}],"201":[0,{"line":81,"col":11,"index":1914},{"line":81,"col":11,"index":1914}],"202":[0,{"line":81,"col":16,"index":1919},{"line":81,"col":18,"index":1921}],"203":[0,{"line":81,"col":21,"index":1924},{"line":81,"col":23,"index":1926}],"204":[0,{"line":81,"col":29,"index":1932},{"line":81,"col":31,"index":1934}],"205":[0,{"line":81,"col":15,"index":1918},{"line":81,"col":31,"index":1934}],"206":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":6,"index":1946}],"207":[0,{"line":82,"col":10,"index":1950},{"line":82,"col":10,"index":1950}],"208":[0,{"line":82,"col":6,"index":1946},{"line":82,"col":10,"index":1950}],"209":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"210":[0,{"line":81,"col":2,"index":1905},{"line":83,"col":51,"index":1954}],"211":[0,{"line":85,"col":10,"index":1997},{"line":85,"col":10,"index":1997}],"212":[0,{"line":85,"col":15,"index":2002},{"line":85,"col":15,"index":2002}],"213":[0,{"line":85,"col":21,"index":2008},{"line":85,"col":21,"index":2008}],"214":[0,{"line":85,"col":14,"index":2001},{"line":85,"col":21,"index":2008}],"215":[0,{"line":86,"col":6,"index":2020},{"line":86,"col":6,"index":2020}],"216":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"217":[0,{"line":85,"col":2,"index":1989},{"line":87,"col":37,"index":2024}],"218":[0,{"line":89,"col":9,"index":2036},{"line":89,"col":11,"index":2038}],"219":[0,{"line":89,"col":2,"index":2029},{"line":89,"col":11,"index":2038}],"220":[0,{"line":90,"col":21,"index":2061},{"line":90,"col":21,"index":2061}],"221":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"222":[0,{"line":90,"col":16,"index":2056},{"line":90,"col":21,"index":2061}],"223":[0,{"line":90,"col":2,"index":2042},{"line":90,"col":21,"index":2061}],"224":[0,{"line":93,"col":18,"index":2116},{"line":93,"col":20,"index":2118}],"225":[0,{"line":93,"col":15,"index":2113},{"line":93,"col":20,"index":2118}],"226":[0,{"line":93,"col":26,"index":2124},{"line":93,"col":28,"index":2126}],"227":[0,{"line":93,"col":23,"index":2121},{"line":93,"col":28,"index":2126}],"228":[0,{"line":93,"col":32,"index":2130},{"line":93,"col":34,"index":2132}],"229":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":8,"index":2146}],"230":[0,{"line":94,"col":12,"index":2150},{"line":94,"col":12,"index":2150}],"231":[0,{"line":94,"col":8,"index":2146},{"line":94,"col":12,"index":2150}],"232":[0,{"line":95,"col":4,"index":2157},{"line":95,"col":4,"index":2157}],"233":[0,{"line":96,"col":9,"index":2168},{"line":96,"col":9,"index":2168}],"234":[0,{"line":94,"col":4,"index":2142},{"line":96,"col":30,"index":2168}],"235":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"236":[0,{"line":93,"col":2,"index":2100},{"line":97,"col":74,"index":2172}],"237":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":21,"index":2220}],"238":[0,{"line":101,"col":27,"index":2226},{"line":101,"col":30,"index":2229}],"239":[0,{"line":101,"col":17,"index":2216},{"line":101,"col":30,"index":2229}],"240":[0,{"line":101,"col":2,"index":2201},{"line":101,"col":30,"index":2229}],"241":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":20,"index":2251}],"242":[0,{"line":102,"col":25,"index":2256},{"line":102,"col":28,"index":2259}],"243":[0,{"line":102,"col":16,"index":2247},{"line":102,"col":28,"index":2259}],"244":[0,{"line":102,"col":2,"index":2233},{"line":102,"col":28,"index":2259}],"245":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":25,"index":2286}],"246":[0,{"line":103,"col":35,"index":2296},{"line":103,"col":38,"index":2299}],"247":[0,{"line":103,"col":21,"index":2282},{"line":103,"col":38,"index":2299}],"248":[0,{"line":103,"col":2,"index":2263},{"line":103,"col":38,"index":2299}],"249":[0,{"line":104,"col":8,"index":2309},{"line":104,"col":8,"index":2309}],"250":[0,{"line":104,"col":13,"index":2314},{"line":104,"col":13,"index":2314}],"251":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"252":[0,{"line":104,"col":2,"index":2303},{"line":104,"col":13,"index":2314}],"253":[0,{"line":105,"col":8,"index":2324},{"line":105,"col":8,"index":2324}],"254":[0,{"line":105,"col":15,"index":2331},{"line":105,"col":15,"index":2331}],"255":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":16,"index":2332}],"256":[0,{"line":105,"col":26,"index":2342},{"line":105,"col":26,"index":2342}],"257":[0,{"line":105,"col":22,"index":2338},{"line":105,"col":27,"index":2343}],"258":[0,{"line":105,"col":13,"index":2329},{"line":105,"col":27,"index":2343}],"259":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"260":[0,{"line":105,"col":2,"index":2318},{"line":105,"col":27,"index":2343}],"261":[0,{"line":106,"col":19,"index":2364},{"line":106,"col":19,"index":2364}],"262":[0,{"line":106,"col":26,"index":2371},{"line":106,"col":26,"index":2371}],"263":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":27,"index":2372}],"264":[0,{"line":106,"col":37,"index":2382},{"line":106,"col":37,"index":2382}],"265":[0,{"line":106,"col":33,"index":2378},{"line":106,"col":38,"index":2383}],"266":[0,{"line":106,"col":24,"index":2369},{"line":106,"col":38,"index":2383}],"267":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"268":[0,{"line":106,"col":2,"index":2347},{"line":106,"col":38,"index":2383}],"269":[0,{"line":107,"col":18,"index":2403},{"line":107,"col":18,"index":2403}],"270":[0,{"line":107,"col":25,"index":2410},{"line":107,"col":25,"index":2410}],"271":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":26,"index":2411}],"272":[0,{"line":107,"col":35,"index":2420},{"line":107,"col":35,"index":2420}],"273":[0,{"line":107,"col":31,"index":2416},{"line":107,"col":36,"index":2421}],"274":[0,{"line":107,"col":23,"index":2408},{"line":107,"col":36,"index":2421}],"275":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"276":[0,{"line":107,"col":2,"index":2387},{"line":107,"col":36,"index":2421}],"277":[0,{"line":110,"col":6,"index":2459},{"line":110,"col":10,"index":2463}],"278":[0,{"line":111,"col":6,"index":2472},{"line":111,"col":9,"index":2475}],"279":[0,{"line":112,"col":6,"index":2484},{"line":112,"col":10,"index":2488}],"280":[0,{"line":109,"col":23,"index":2447},{"line":113,"col":68,"index":2492}],"281":[0,{"line":109,"col":2,"index":2426},{"line":113,"col":68,"index":2492}],"282":[0,{"line":116,"col":6,"index":2534},{"line":116,"col":10,"index":2538}],"283":[0,{"line":117,"col":6,"index":2547},{"line":117,"col":9,"index":2550}],"284":[0,{"line":118,"col":6,"index":2559},{"line":118,"col":10,"index":2563}],"285":[0,{"line":115,"col":27,"index":2522},{"line":119,"col":72,"index":2567}],"286":[0,{"line":115,"col":2,"index":2497},{"line":119,"col":72,"index":2567}],"287":[0,{"line":122,"col":6,"index":2603},{"line":122,"col":10,"index":2607}],"288":[0,{"line":123,"col":6,"index":2616},{"line":123,"col":9,"index":2619}],"289":[0,{"line":124,"col":6,"index":2628},{"line":124,"col":10,"index":2632}],"290":[0,{"line":121,"col":22,"index":2592},{"line":125,"col":66,"index":2636}],"291":[0,{"line":121,"col":2,"index":2572},{"line":125,"col":66,"index":2636}],"292":[0,{"line":128,"col":6,"index":2677},{"line":128,"col":10,"index":2681}],"293":[0,{"line":129,"col":6,"index":2690},{"line":129,"col":9,"index":2693}],"294":[0,{"line":130,"col":6,"index":2702},{"line":130,"col":10,"index":2706}],"295":[0,{"line":127,"col":26,"index":2665},{"line":131,"col":71,"index":2710}],"296":[0,{"line":127,"col":2,"index":2641},{"line":131,"col":71,"index":2710}],"297":[0,{"line":133,"col":21,"index":2734},{"line":133,"col":24,"index":2737}],"298":[0,{"line":133,"col":27,"index":2740},{"line":133,"col":27,"index":2740}],"299":[0,{"line":133,"col":34,"index":2747},{"line":133,"col":34,"index":2747}],"300":[0,{"line":133,"col":17,"index":2730},{"line":133,"col":34,"index":2747}],"301":[0,{"line":133,"col":2,"index":2715},{"line":133,"col":34,"index":2747}],"302":[0,{"line":134,"col":16,"index":2765},{"line":134,"col":16,"index":2765}],"303":[0,{"line":134,"col":19,"index":2768},{"line":134,"col":19,"index":2768}],"304":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":28,"index":2777}],"305":[0,{"line":134,"col":32,"index":2781},{"line":134,"col":33,"index":2782}],"306":[0,{"line":134,"col":28,"index":2777},{"line":134,"col":33,"index":2782}],"307":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":36,"index":2785}],"308":[0,{"line":134,"col":40,"index":2789},{"line":134,"col":40,"index":2789}],"309":[0,{"line":134,"col":36,"index":2785},{"line":134,"col":40,"index":2789}],"310":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":47,"index":2796}],"311":[0,{"line":134,"col":51,"index":2800},{"line":134,"col":51,"index":2800}],"312":[0,{"line":134,"col":47,"index":2796},{"line":134,"col":51,"index":2800}],"313":[0,{"line":134,"col":24,"index":2773},{"line":134,"col":51,"index":2800}],"314":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"315":[0,{"line":134,"col":2,"index":2751},{"line":134,"col":51,"index":2800}],"316":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":12,"index":2841}],"317":[0,{"line":137,"col":17,"index":2846},{"line":137,"col":19,"index":2848}],"318":[0,{"line":137,"col":10,"index":2839},{"line":137,"col":19,"index":2848}],"319":[0,{"line":137,"col":2,"index":2831},{"line":137,"col":19,"index":2848}],"320":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":16,"index":2866}],"321":[0,{"line":138,"col":22,"index":2872},{"line":138,"col":24,"index":2874}],"322":[0,{"line":138,"col":15,"index":2865},{"line":138,"col":25,"index":2875}],"323":[0,{"line":138,"col":2,"index":2852},{"line":138,"col":25,"index":2875}],"324":[0,{"line":141,"col":13,"index":2939},{"line":141,"col":13,"index":2939}],"325":[0,{"line":141,"col":16,"index":2942},{"line":141,"col":16,"index":2942}],"326":[0,{"line":141,"col":21,"index":2947},{"line":141,"col":21,"index":2947}],"327":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"328":[0,{"line":141,"col":2,"index":2928},{"line":141,"col":21,"index":2947}],"329":[0,{"line":142,"col":31,"index":2980},{"line":142,"col":33,"index":2982}],"330":[0,{"line":142,"col":36,"index":2985},{"line":142,"col":37,"index":2986}],"331":[0,{"line":142,"col":24,"index":2973},{"line":142,"col":38,"index":2987}],"332":[0,{"line":142,"col":2,"index":2951},{"line":142,"col":38,"index":2987}],"333":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":24,"index":3013}],"334":[0,{"line":143,"col":33,"index":3022},{"line":143,"col":34,"index":3023}],"335":[0,{"line":143,"col":22,"index":3011},{"line":143,"col":35,"index":3024}],"336":[0,{"line":143,"col":2,"index":2991},{"line":143,"col":35,"index":3024}],"337":[0,{"line":145,"col":19,"index":3102},{"line":145,"col":19,"index":3102}],"338":[0,{"line":145,"col":22,"index":3105},{"line":145,"col":26,"index":3109}],"339":[0,{"line":145,"col":16,"index":3099},{"line":145,"col":27,"index":3110}],"340":[0,{"line":145,"col":2,"index":3085},{"line":145,"col":27,"index":3110}],"341":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":22,"index":3279}],"342":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":31,"index":3288}],"343":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":36,"index":3293}],"344":[0,{"line":150,"col":40,"index":3297},{"line":150,"col":41,"index":3298}],"345":[0,{"line":150,"col":36,"index":3293},{"line":150,"col":41,"index":3298}],"346":[0,{"line":150,"col":31,"index":3288},{"line":150,"col":41,"index":3298}],"347":[0,{"line":150,"col":22,"index":3279},{"line":150,"col":42,"index":3299}],"348":[0,{"line":150,"col":2,"index":3259},{"line":150,"col":42,"index":3299}],"349":[0,{"line":152,"col":25,"index":3356},{"line":152,"col":25,"index":3356}],"350":[0,{"line":152,"col":28,"index":3359},{"line":152,"col":32,"index":3363}],"351":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":33,"index":3364}],"352":[0,{"line":152,"col":42,"index":3373},{"line":152,"col":42,"index":3373}],"353":[0,{"line":152,"col":45,"index":3376},{"line":152,"col":47,"index":3378}],"354":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":54,"index":3385}],"355":[0,{"line":152,"col":58,"index":3389},{"line":152,"col":60,"index":3391}],"356":[0,{"line":152,"col":54,"index":3385},{"line":152,"col":60,"index":3391}],"357":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"358":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"359":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"360":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"361":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"362":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"363":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"364":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"365":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"366":[0,{"line":152,"col":40,"index":3371},{"line":152,"col":60,"index":3391}],"367":[0,{"line":152,"col":18,"index":3349},{"line":152,"col":62,"index":3393}],"368":[0,{"line":152,"col":2,"index":3333},{"line":152,"col":62,"index":3393}],"369":[0,{"line":155,"col":21,"index":3458},{"line":155,"col":21,"index":3458}],"370":[0,{"line":155,"col":15,"index":3452},{"line":155,"col":22,"index":3459}],"371":[0,{"line":155,"col":4,"index":3441},{"line":155,"col":22,"index":3459}],"372":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":6,"index":3477}],"373":[0,{"line":157,"col":10,"index":3481},{"line":157,"col":11,"index":3482}],"374":[0,{"line":157,"col":6,"index":3477},{"line":157,"col":11,"index":3482}],"375":[0,{"line":158,"col":11,"index":3496},{"line":158,"col":11,"index":3496}],"376":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"377":[0,{"line":158,"col":6,"index":3491},{"line":158,"col":11,"index":3496}],"378":[0,{"line":156,"col":4,"index":3465},{"line":159,"col":41,"index":3502}],"379":[0,{"line":155,"col":4,"index":3441},{"line":159,"col":65,"index":3502}],"380":[0,{"line":154,"col":2,"index":3414},{"line":160,"col":94,"index":3506}],"381":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":22,"index":3545}],"382":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":31,"index":3554}],"383":[0,{"line":162,"col":36,"index":3559},{"line":162,"col":39,"index":3562}],"384":[0,{"line":162,"col":31,"index":3554},{"line":162,"col":39,"index":3562}],"385":[0,{"line":162,"col":22,"index":3545},{"line":162,"col":40,"index":3563}],"386":[0,{"line":162,"col":2,"index":3525},{"line":162,"col":40,"index":3563}],"387":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":10,"index":3576}],"388":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":18,"index":3584}],"389":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":23,"index":3589}],"390":[0,{"line":164,"col":27,"index":3593},{"line":164,"col":27,"index":3593}],"391":[0,{"line":164,"col":23,"index":3589},{"line":164,"col":27,"index":3593}],"392":[0,{"line":164,"col":18,"index":3584},{"line":164,"col":27,"index":3593}],"393":[0,{"line":164,"col":10,"index":3576},{"line":164,"col":28,"index":3594}],"394":[0,{"line":164,"col":2,"index":3568},{"line":164,"col":28,"index":3594}],"395":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":23,"index":3620}],"396":[0,{"line":166,"col":37,"index":3634},{"line":166,"col":37,"index":3634}],"397":[0,{"line":166,"col":40,"index":3637},{"line":166,"col":40,"index":3637}],"398":[0,{"line":166,"col":33,"index":3630},{"line":166,"col":41,"index":3638}],"399":[0,{"line":166,"col":23,"index":3620},{"line":166,"col":42,"index":3639}],"400":[0,{"line":166,"col":2,"index":3599},{"line":166,"col":42,"index":3639}],"401":[0,{"line":169,"col":17,"index":3698},{"line":169,"col":17,"index":3698}],"402":[0,{"line":169,"col":20,"index":3701},{"line":169,"col":20,"index":3701}],"403":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":21,"index":3702}],"404":[0,{"line":169,"col":12,"index":3693},{"line":169,"col":28,"index":3709}],"405":[0,{"line":169,"col":2,"index":3683},{"line":169,"col":28,"index":3709}],"406":[0,{"line":172,"col":20,"index":3753},{"line":172,"col":20,"index":3753}],"407":[0,{"line":172,"col":23,"index":3756},{"line":172,"col":23,"index":3756}],"408":[0,{"line":172,"col":26,"index":3759},{"line":172,"col":26,"index":3759}],"409":[0,{"line":172,"col":19,"index":3752},{"line":172,"col":27,"index":3760}],"410":[0,{"line":172,"col":2,"index":3735},{"line":172,"col":27,"index":3760}],"411":[0,{"line":173,"col":24,"index":3786},{"line":173,"col":24,"index":3786}],"412":[0,{"line":173,"col":27,"index":3789},{"line":173,"col":27,"index":3789}],"413":[0,{"line":173,"col":30,"index":3792},{"line":173,"col":30,"index":3792}],"414":[0,{"line":173,"col":20,"index":3782},{"line":173,"col":31,"index":3793}],"415":[0,{"line":173,"col":2,"index":3764},{"line":173,"col":31,"index":3793}],"416":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":18,"index":3813}],"417":[0,{"line":174,"col":23,"index":3818},{"line":174,"col":23,"index":3818}],"418":[0,{"line":174,"col":18,"index":3813},{"line":174,"col":23,"index":3818}],"419":[0,{"line":174,"col":2,"index":3797},{"line":174,"col":23,"index":3818}],"420":[0,{"line":175,"col":19,"index":3839},{"line":175,"col":19,"index":3839}],"421":[0,{"line":175,"col":22,"index":3842},{"line":175,"col":22,"index":3842}],"422":[0,{"line":175,"col":25,"index":3845},{"line":175,"col":25,"index":3845}],"423":[0,{"line":175,"col":18,"index":3838},{"line":175,"col":26,"index":3846}],"424":[0,{"line":175,"col":2,"index":3822},{"line":175,"col":26,"index":3846}],"425":[0,{"line":176,"col":24,"index":3872},{"line":176,"col":24,"index":3872}],"426":[0,{"line":176,"col":27,"index":3875},{"line":176,"col":27,"index":3875}],"427":[0,{"line":176,"col":30,"index":3878},{"line":176,"col":30,"index":3878}],"428":[0,{"line":176,"col":19,"index":3867},{"line":176,"col":31,"index":3879}],"429":[0,{"line":176,"col":2,"index":3850},{"line":176,"col":31,"index":3879}],"430":[0,{"line":177,"col":23,"index":3904},{"line":177,"col":23,"index":3904}],"431":[0,{"line":177,"col":26,"index":3907},{"line":177,"col":26,"index":3907}],"432":[0,{"line":177,"col":29,"index":3910},{"line":177,"col":29,"index":3910}],"433":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":30,"index":3911}],"434":[0,{"line":177,"col":32,"index":3913},{"line":177,"col":32,"index":3913}],"435":[0,{"line":177,"col":22,"index":3903},{"line":177,"col":33,"index":3914}],"436":[0,{"line":177,"col":2,"index":3883},{"line":177,"col":33,"index":3914}],"437":[0,{"line":178,"col":28,"index":3944},{"line":178,"col":33,"index":3949}],"438":[0,{"line":178,"col":22,"index":3938},{"line":178,"col":33,"index":3949}],"439":[0,{"line":178,"col":42,"index":3958},{"line":178,"col":45,"index":3961}],"440":[0,{"line":178,"col":36,"index":3952},{"line":178,"col":45,"index":3961}],"441":[0,{"line":178,"col":20,"index":3936},{"line":178,"col":47,"index":3963}],"442":[0,{"line":178,"col":2,"index":3918},{"line":178,"col":47,"index":3963}],"443":[0,{"line":179,"col":25,"index":3990},{"line":179,"col":30,"index":3995}],"444":[0,{"line":179,"col":33,"index":3998},{"line":179,"col":38,"index":4003}],"445":[0,{"line":179,"col":41,"index":4006},{"line":179,"col":46,"index":4011}],"446":[0,{"line":179,"col":49,"index":4014},{"line":179,"col":52,"index":4017}],"447":[0,{"line":179,"col":21,"index":3986},{"line":179,"col":53,"index":4018}],"448":[0,{"line":179,"col":2,"index":3967},{"line":179,"col":53,"index":4018}],"449":[0,{"line":180,"col":29,"index":4049},{"line":180,"col":35,"index":4055}],"450":[0,{"line":180,"col":23,"index":4043},{"line":180,"col":35,"index":4055}],"451":[0,{"line":180,"col":44,"index":4064},{"line":180,"col":47,"index":4067}],"452":[0,{"line":180,"col":38,"index":4058},{"line":180,"col":47,"index":4067}],"453":[0,{"line":180,"col":53,"index":4073},{"line":180,"col":63,"index":4083}],"454":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"455":[0,{"line":180,"col":21,"index":4041},{"line":180,"col":65,"index":4085}],"456":[0,{"line":180,"col":2,"index":4022},{"line":180,"col":65,"index":4085}],"457":[0,{"line":181,"col":21,"index":4108},{"line":181,"col":21,"index":4108}],"458":[0,{"line":181,"col":24,"index":4111},{"line":181,"col":24,"index":4111}],"459":[0,{"line":181,"col":27,"index":4114},{"line":181,"col":27,"index":4114}],"460":[0,{"line":181,"col":17,"index":4104},{"line":181,"col":28,"index":4115}],"461":[0,{"line":181,"col":2,"index":4089},{"line":181,"col":28,"index":4115}],"462":[0,{"line":185,"col":22,"index":4187},{"line":185,"col":22,"index":4187}],"463":[0,{"line":185,"col":19,"index":4184},{"line":185,"col":22,"index":4187}],"464":[0,{"line":185,"col":28,"index":4193},{"line":185,"col":32,"index":4197}],"465":[0,{"line":185,"col":25,"index":4190},{"line":185,"col":32,"index":4197}],"466":[0,{"line":185,"col":17,"index":4182},{"line":185,"col":34,"index":4199}],"467":[0,{"line":185,"col":4,"index":4169},{"line":185,"col":34,"index":4199}],"468":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":9,"index":4210}],"469":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"470":[0,{"line":186,"col":4,"index":4205},{"line":186,"col":11,"index":4212}],"471":[0,{"line":185,"col":4,"index":4169},{"line":186,"col":47,"index":4212}],"472":[0,{"line":184,"col":2,"index":4149},{"line":186,"col":65,"index":4212}],"473":[0,{"line":189,"col":21,"index":4253},{"line":189,"col":23,"index":4255}],"474":[0,{"line":189,"col":26,"index":4258},{"line":189,"col":26,"index":4258}],"475":[0,{"line":189,"col":17,"index":4249},{"line":189,"col":27,"index":4259}],"476":[0,{"line":189,"col":4,"index":4236},{"line":189,"col":27,"index":4259}],"477":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":9,"index":4270}],"478":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"479":[0,{"line":190,"col":4,"index":4265},{"line":190,"col":12,"index":4273}],"480":[0,{"line":189,"col":4,"index":4236},{"line":190,"col":41,"index":4273}],"481":[0,{"line":188,"col":2,"index":4217},{"line":190,"col":58,"index":4273}],"482":[0,{"line":192,"col":14,"index":4290},{"line":192,"col":14,"index":4290}],"483":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":19,"index":4295}],"484":[0,{"line":192,"col":24,"index":4300},{"line":192,"col":25,"index":4301}],"485":[0,{"line":192,"col":19,"index":4295},{"line":192,"col":25,"index":4301}],"486":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"487":[0,{"line":192,"col":2,"index":4278},{"line":192,"col":25,"index":4301}],"488":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":19,"index":4349}],"489":[0,{"line":195,"col":24,"index":4354},{"line":195,"col":28,"index":4358}],"490":[0,{"line":195,"col":19,"index":4349},{"line":195,"col":29,"index":4359}],"491":[0,{"line":195,"col":2,"index":4332},{"line":195,"col":29,"index":4359}],"492":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":27,"index":4388}],"493":[0,{"line":196,"col":38,"index":4399},{"line":196,"col":42,"index":4403}],"494":[0,{"line":196,"col":23,"index":4384},{"line":196,"col":43,"index":4404}],"495":[0,{"line":196,"col":2,"index":4363},{"line":196,"col":43,"index":4404}],"496":[0,{"line":197,"col":22,"index":4428},{"line":197,"col":22,"index":4428}],"497":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":23,"index":4429}],"498":[0,{"line":197,"col":41,"index":4447},{"line":197,"col":41,"index":4447}],"499":[0,{"line":197,"col":43,"index":4449},{"line":197,"col":43,"index":4449}],"500":[0,{"line":197,"col":45,"index":4451},{"line":197,"col":45,"index":4451}],"501":[0,{"line":197,"col":37,"index":4443},{"line":197,"col":46,"index":4452}],"502":[0,{"line":197,"col":28,"index":4434},{"line":197,"col":47,"index":4453}],"503":[0,{"line":197,"col":18,"index":4424},{"line":197,"col":48,"index":4454}],"504":[0,{"line":197,"col":2,"index":4408},{"line":197,"col":48,"index":4454}],"505":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":20,"index":4501}],"506":[0,{"line":200,"col":24,"index":4505},{"line":200,"col":24,"index":4505}],"507":[0,{"line":200,"col":20,"index":4501},{"line":200,"col":24,"index":4505}],"508":[0,{"line":200,"col":2,"index":4483},{"line":200,"col":24,"index":4505}],"509":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":13,"index":4549}],"510":[0,{"line":202,"col":18,"index":4554},{"line":202,"col":18,"index":4554}],"511":[0,{"line":202,"col":13,"index":4549},{"line":202,"col":18,"index":4554}],"512":[0,{"line":202,"col":2,"index":4538},{"line":202,"col":18,"index":4554}],"513":[0,{"line":205,"col":2,"index":4572},{"line":205,"col":14,"index":4584}],"514":[0,{"line":206,"col":2,"index":4588},{"line":206,"col":12,"index":4598}],"515":[0,{"line":209,"col":21,"index":4636},{"line":209,"col":23,"index":4638}],"516":[0,{"line":209,"col":17,"index":4632},{"line":209,"col":24,"index":4639}],"517":[0,{"line":209,"col":2,"index":4617},{"line":209,"col":24,"index":4639}],"518":[0,{"line":211,"col":2,"index":4644},{"line":211,"col":24,"index":4666}],"519":[0,{"line":213,"col":10,"index":4679},{"line":213,"col":16,"index":4685}],"520":[0,{"line":213,"col":2,"index":4671},{"line":213,"col":16,"index":4685}],"521":[0,{"line":221,"col":19,"index":4906},{"line":221,"col":19,"index":4906}],"522":[0,{"line":221,"col":15,"index":4902},{"line":221,"col":15,"index":4902}],"523":[0,{"line":221,"col":2,"index":4889},{"line":221,"col":29,"index":4916}],"524":[0,{"line":14,"col":0,"index":140},{"line":225,"col":4855,"index":4995}]}} \ No newline at end of file diff --git a/quint/testFixture/TrivialTypeError.json b/quint/testFixture/TrivialTypeError.json index 38134d759..b65970887 100644 --- a/quint/testFixture/TrivialTypeError.json +++ b/quint/testFixture/TrivialTypeError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":4,"name":"Foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"}}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":4,"name":"Foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"str","value":"not an int"},"typeAnnotation":{"id":1,"kind":"int"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.json b/quint/testFixture/_0099unorderedDefs.json index 790ad267c..9133a4742 100644 --- a/quint/testFixture/_0099unorderedDefs.json +++ b/quint/testFixture/_0099unorderedDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":12,"name":"unorderedDefs","declarations":[{"id":11,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x"},{"id":7,"name":"y"}],"qualifier":"puredef","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"name","name":"y"}]}}},{"id":5,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":1,"name":"x","kind":"param"},"4":{"id":11,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x"},{"id":7,"name":"y"}],"qualifier":"puredef","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"name","name":"y"}]}},"depth":0},"8":{"id":6,"name":"x","kind":"param"},"9":{"id":7,"name":"y","kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":14,"name":"unorderedDefs","declarations":[{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}}},{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":1,"name":"x","kind":"param","depth":1},"4":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0},"6":{"id":6,"kind":"def","name":"double","qualifier":"puredef","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":4,"kind":"app","opcode":"plus","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"name","name":"x"}]}},"depth":0},"9":{"id":7,"name":"x","kind":"param","depth":1,"shadowing":false},"10":{"id":8,"name":"y","kind":"param","depth":1},"13":{"id":13,"kind":"def","name":"plus","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":7,"name":"x"},{"id":8,"name":"y"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"iadd","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"name","name":"y"}]}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_0099unorderedDefs.map.json b/quint/testFixture/_0099unorderedDefs.map.json index 720b088e1..fb24899a8 100644 --- a/quint/testFixture/_0099unorderedDefs.map.json +++ b/quint/testFixture/_0099unorderedDefs.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0099unorderedDefs.qnt"},"map":{"1":[0,{"line":2,"col":18,"index":93},{"line":2,"col":18,"index":93}],"2":[0,{"line":2,"col":28,"index":103},{"line":2,"col":28,"index":103}],"3":[0,{"line":2,"col":31,"index":106},{"line":2,"col":31,"index":106}],"4":[0,{"line":2,"col":23,"index":98},{"line":2,"col":32,"index":107}],"5":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"6":[0,{"line":3,"col":16,"index":125},{"line":3,"col":16,"index":125}],"7":[0,{"line":3,"col":19,"index":128},{"line":3,"col":19,"index":128}],"8":[0,{"line":3,"col":24,"index":133},{"line":3,"col":24,"index":133}],"9":[0,{"line":3,"col":28,"index":137},{"line":3,"col":28,"index":137}],"10":[0,{"line":3,"col":24,"index":133},{"line":3,"col":28,"index":137}],"11":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"12":[0,{"line":1,"col":0,"index":52},{"line":4,"col":87,"index":139}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0099unorderedDefs.qnt"},"map":{"1":[0,{"line":2,"col":18,"index":93},{"line":2,"col":18,"index":93}],"2":[0,{"line":2,"col":28,"index":103},{"line":2,"col":28,"index":103}],"3":[0,{"line":2,"col":31,"index":106},{"line":2,"col":31,"index":106}],"4":[0,{"line":2,"col":23,"index":98},{"line":2,"col":32,"index":107}],"5":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"6":[0,{"line":2,"col":2,"index":77},{"line":2,"col":32,"index":107}],"7":[0,{"line":3,"col":16,"index":125},{"line":3,"col":16,"index":125}],"8":[0,{"line":3,"col":19,"index":128},{"line":3,"col":19,"index":128}],"9":[0,{"line":3,"col":24,"index":133},{"line":3,"col":24,"index":133}],"10":[0,{"line":3,"col":28,"index":137},{"line":3,"col":28,"index":137}],"11":[0,{"line":3,"col":24,"index":133},{"line":3,"col":28,"index":137}],"12":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"13":[0,{"line":3,"col":2,"index":111},{"line":3,"col":28,"index":137}],"14":[0,{"line":1,"col":0,"index":52},{"line":4,"col":87,"index":139}]}} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.json b/quint/testFixture/_0100cyclicDefs.json index e6c7b5d67..3b57dcac4 100644 --- a/quint/testFixture/_0100cyclicDefs.json +++ b/quint/testFixture/_0100cyclicDefs.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"3":{"id":8,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":8,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"puredef","expr":{"id":7,"kind":"app","opcode":"baz","args":[{"id":6,"kind":"name","name":"x"}]}},"depth":0},"6":{"id":5,"name":"x","kind":"param"},"7":{"id":12,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"x"}],"qualifier":"puredef","expr":{"id":11,"kind":"app","opcode":"foo","args":[{"id":10,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":9,"name":"x","kind":"param"},"11":{"id":4,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":16,"name":"cyclicDefs","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"3":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"5":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1,"shadowing":false},"8":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0},"10":{"id":10,"kind":"def","name":"bar","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"baz","args":[{"id":7,"kind":"name","name":"x"}]}},"depth":0},"12":{"id":11,"name":"x","kind":"param","depth":1,"shadowing":false},"13":{"id":5,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":4,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":3,"kind":"app","opcode":"bar","args":[{"id":2,"kind":"name","name":"x"}]}},"depth":0},"15":{"id":15,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"x"}],"qualifier":"puredef","expr":{"id":13,"kind":"app","opcode":"foo","args":[{"id":12,"kind":"name","name":"x"}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":2,"col":2,"index":70},"end":{"line":2,"col":25,"index":93}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":3,"col":2,"index":97},"end":{"line":3,"col":25,"index":120}}]},{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0100cyclicDefs.qnt","start":{"line":4,"col":2,"index":124},"end":{"line":4,"col":25,"index":147}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0100cyclicDefs.map.json b/quint/testFixture/_0100cyclicDefs.map.json index 2e7b86aac..1c3c97576 100644 --- a/quint/testFixture/_0100cyclicDefs.map.json +++ b/quint/testFixture/_0100cyclicDefs.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0100cyclicDefs.qnt"},"map":{"1":[0,{"line":2,"col":15,"index":83},{"line":2,"col":15,"index":83}],"2":[0,{"line":2,"col":24,"index":92},{"line":2,"col":24,"index":92}],"3":[0,{"line":2,"col":20,"index":88},{"line":2,"col":25,"index":93}],"4":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"5":[0,{"line":3,"col":15,"index":110},{"line":3,"col":15,"index":110}],"6":[0,{"line":3,"col":24,"index":119},{"line":3,"col":24,"index":119}],"7":[0,{"line":3,"col":20,"index":115},{"line":3,"col":25,"index":120}],"8":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"9":[0,{"line":4,"col":15,"index":137},{"line":4,"col":15,"index":137}],"10":[0,{"line":4,"col":24,"index":146},{"line":4,"col":24,"index":146}],"11":[0,{"line":4,"col":20,"index":142},{"line":4,"col":25,"index":147}],"12":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"13":[0,{"line":1,"col":0,"index":48},{"line":5,"col":101,"index":149}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0100cyclicDefs.qnt"},"map":{"1":[0,{"line":2,"col":15,"index":83},{"line":2,"col":15,"index":83}],"2":[0,{"line":2,"col":24,"index":92},{"line":2,"col":24,"index":92}],"3":[0,{"line":2,"col":20,"index":88},{"line":2,"col":25,"index":93}],"4":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"5":[0,{"line":2,"col":2,"index":70},{"line":2,"col":25,"index":93}],"6":[0,{"line":3,"col":15,"index":110},{"line":3,"col":15,"index":110}],"7":[0,{"line":3,"col":24,"index":119},{"line":3,"col":24,"index":119}],"8":[0,{"line":3,"col":20,"index":115},{"line":3,"col":25,"index":120}],"9":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"10":[0,{"line":3,"col":2,"index":97},{"line":3,"col":25,"index":120}],"11":[0,{"line":4,"col":15,"index":137},{"line":4,"col":15,"index":137}],"12":[0,{"line":4,"col":24,"index":146},{"line":4,"col":24,"index":146}],"13":[0,{"line":4,"col":20,"index":142},{"line":4,"col":25,"index":147}],"14":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"15":[0,{"line":4,"col":2,"index":124},{"line":4,"col":25,"index":147}],"16":[0,{"line":1,"col":0,"index":48},{"line":5,"col":101,"index":149}]}} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.json b/quint/testFixture/_0101noRecursion.json index 708652a10..d43c5188a 100644 --- a/quint/testFixture/_0101noRecursion.json +++ b/quint/testFixture/_0101noRecursion.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param"},"5":{"id":6,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"noRecursion","declarations":[]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"5":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0},"7":{"id":7,"kind":"def","name":"blackhole","qualifier":"puredef","expr":{"id":6,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"blackhole","args":[{"id":4,"kind":"app","opcode":"iadd","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":1}]}]}},"depth":0}},"errors":[{"explanation":"[QNT099] Found cyclic declarations. Use fold and foldl instead of recursion","locs":[{"source":"mocked_path/testFixture/_0101noRecursion.qnt","start":{"line":3,"col":2,"index":131},"end":{"line":3,"col":41,"index":170}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_0101noRecursion.map.json b/quint/testFixture/_0101noRecursion.map.json index 0b3104b5e..202f9fe24 100644 --- a/quint/testFixture/_0101noRecursion.map.json +++ b/quint/testFixture/_0101noRecursion.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_0101noRecursion.qnt"},"map":{"1":[0,{"line":3,"col":21,"index":150},{"line":3,"col":21,"index":150}],"2":[0,{"line":3,"col":36,"index":165},{"line":3,"col":36,"index":165}],"3":[0,{"line":3,"col":40,"index":169},{"line":3,"col":40,"index":169}],"4":[0,{"line":3,"col":36,"index":165},{"line":3,"col":40,"index":169}],"5":[0,{"line":3,"col":26,"index":155},{"line":3,"col":41,"index":170}],"6":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"7":[0,{"line":1,"col":0,"index":56},{"line":4,"col":116,"index":172}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_0101noRecursion.qnt"},"map":{"1":[0,{"line":3,"col":21,"index":150},{"line":3,"col":21,"index":150}],"2":[0,{"line":3,"col":36,"index":165},{"line":3,"col":36,"index":165}],"3":[0,{"line":3,"col":40,"index":169},{"line":3,"col":40,"index":169}],"4":[0,{"line":3,"col":36,"index":165},{"line":3,"col":40,"index":169}],"5":[0,{"line":3,"col":26,"index":155},{"line":3,"col":41,"index":170}],"6":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"7":[0,{"line":3,"col":2,"index":131},{"line":3,"col":41,"index":170}],"8":[0,{"line":1,"col":0,"index":56},{"line":4,"col":116,"index":172}]}} \ No newline at end of file diff --git a/quint/testFixture/_1010undefinedName.json b/quint/testFixture/_1010undefinedName.json index 3699f8811..bece81daa 100644 --- a/quint/testFixture/_1010undefinedName.json +++ b/quint/testFixture/_1010undefinedName.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"definedModule","declarations":[{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1}}]},{"id":8,"name":"undefinedName","declarations":[{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"}},{"id":6,"kind":"import","defName":"*","protoName":"undefinedModule"},{"id":7,"kind":"import","defName":"undefinedDefinition","protoName":"definedModule"}]}],"table":{},"errors":[{"explanation":"[QNT405] Module undefinedName imports an unknown module undefinedModule","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT405] Module 'undefinedModule' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT404] Name 'definedModule::undefinedDefinition' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":10,"col":2,"index":167},"end":{"line":10,"col":41,"index":206}}]},{"explanation":"[QNT404] Name 'S' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":6,"col":10,"index":134},"end":{"line":6,"col":10,"index":134}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"definedModule","declarations":[{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1}}]},{"id":8,"name":"undefinedName","declarations":[{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"}},{"id":6,"kind":"import","defName":"*","protoName":"undefinedModule"},{"id":7,"kind":"import","defName":"undefinedDefinition","protoName":"definedModule"}]}],"table":{"2":{"id":2,"kind":"def","name":"a","qualifier":"def","expr":{"id":1,"kind":"int","value":1},"depth":0},"5":{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":4,"kind":"name","name":"S"},"depth":0}},"errors":[{"explanation":"[QNT405] Module undefinedName imports an unknown module undefinedModule","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT405] Module 'undefinedModule' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":8,"col":2,"index":139},"end":{"line":8,"col":25,"index":162}}]},{"explanation":"[QNT404] Name 'definedModule::undefinedDefinition' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":10,"col":2,"index":167},"end":{"line":10,"col":41,"index":206}}]},{"explanation":"[QNT404] Name 'S' not found","locs":[{"source":"mocked_path/testFixture/_1010undefinedName.qnt","start":{"line":6,"col":10,"index":134},"end":{"line":6,"col":10,"index":134}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.json b/quint/testFixture/_1011nameOutOfScope.json index 91ca7950d..4ef31dae3 100644 --- a/quint/testFixture/_1011nameOutOfScope.json +++ b/quint/testFixture/_1011nameOutOfScope.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"nameOutOfScope","declarations":[{"id":9,"kind":"def","name":"A","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"x"},{"id":7,"kind":"int","value":1}]}},{"id":5,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"nameOutOfScope","declarations":[{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]}},{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}}}]}],"table":{"2":{"id":1,"name":"x","kind":"param","depth":1},"6":{"id":6,"kind":"def","name":"f","qualifier":"def","expr":{"id":5,"kind":"lambda","params":[{"id":1,"name":"x"}],"qualifier":"def","expr":{"id":4,"kind":"app","opcode":"igt","args":[{"id":2,"kind":"name","name":"x"},{"id":3,"kind":"int","value":10}]}},"depth":0},"10":{"id":10,"kind":"def","name":"A","qualifier":"val","expr":{"id":9,"kind":"app","opcode":"iadd","args":[{"id":7,"kind":"name","name":"x"},{"id":8,"kind":"int","value":1}]},"depth":0}},"errors":[{"explanation":"[QNT404] Name 'x' not found","locs":[{"source":"mocked_path/testFixture/_1011nameOutOfScope.qnt","start":{"line":4,"col":10,"index":188},"end":{"line":4,"col":10,"index":188}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1011nameOutOfScope.map.json b/quint/testFixture/_1011nameOutOfScope.map.json index 519744a61..c3bd5741b 100644 --- a/quint/testFixture/_1011nameOutOfScope.map.json +++ b/quint/testFixture/_1011nameOutOfScope.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1011nameOutOfScope.qnt"},"map":{"1":[0,{"line":2,"col":8,"index":77},{"line":2,"col":8,"index":77}],"2":[0,{"line":2,"col":13,"index":82},{"line":2,"col":13,"index":82}],"3":[0,{"line":2,"col":17,"index":86},{"line":2,"col":18,"index":87}],"4":[0,{"line":2,"col":13,"index":82},{"line":2,"col":18,"index":87}],"5":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"6":[0,{"line":4,"col":10,"index":188},{"line":4,"col":10,"index":188}],"7":[0,{"line":4,"col":14,"index":192},{"line":4,"col":14,"index":192}],"8":[0,{"line":4,"col":10,"index":188},{"line":4,"col":14,"index":192}],"9":[0,{"line":4,"col":2,"index":180},{"line":4,"col":14,"index":192}],"10":[0,{"line":0,"col":0,"index":0},{"line":5,"col":194,"index":194}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1011nameOutOfScope.qnt"},"map":{"1":[0,{"line":2,"col":8,"index":77},{"line":2,"col":8,"index":77}],"2":[0,{"line":2,"col":13,"index":82},{"line":2,"col":13,"index":82}],"3":[0,{"line":2,"col":17,"index":86},{"line":2,"col":18,"index":87}],"4":[0,{"line":2,"col":13,"index":82},{"line":2,"col":18,"index":87}],"5":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"6":[0,{"line":2,"col":2,"index":71},{"line":2,"col":18,"index":87}],"7":[0,{"line":4,"col":10,"index":188},{"line":4,"col":10,"index":188}],"8":[0,{"line":4,"col":14,"index":192},{"line":4,"col":14,"index":192}],"9":[0,{"line":4,"col":10,"index":188},{"line":4,"col":14,"index":192}],"10":[0,{"line":4,"col":2,"index":180},{"line":4,"col":14,"index":192}],"11":[0,{"line":0,"col":0,"index":0},{"line":5,"col":194,"index":194}]}} \ No newline at end of file diff --git a/quint/testFixture/_1012unknownType.json b/quint/testFixture/_1012unknownType.json index f7e30f970..4e3720254 100644 --- a/quint/testFixture/_1012unknownType.json +++ b/quint/testFixture/_1012unknownType.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"unknown_type","declarations":[{"kind":"var","name":"S","typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"id":2}]}],"table":{},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1012unknownType.qnt","start":{"line":1,"col":9,"index":31},"end":{"line":1,"col":20,"index":42}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"unknown_type","declarations":[{"kind":"var","name":"S","typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"id":2,"depth":0}]}],"table":{},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1012unknownType.qnt","start":{"line":1,"col":9,"index":31},"end":{"line":1,"col":20,"index":42}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1013unknownTypeLetIn.json b/quint/testFixture/_1013unknownTypeLetIn.json index 9d555bbe3..d3e940ca0 100644 --- a/quint/testFixture/_1013unknownTypeLetIn.json +++ b/quint/testFixture/_1013unknownTypeLetIn.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":1}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":9,"name":"unknownTypeLetIn","declarations":[{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":2},"4":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"},"depth":2},"8":{"id":8,"kind":"def","name":"d","qualifier":"def","expr":{"id":7,"kind":"let","opdef":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":10},"typeAnnotation":{"id":1,"kind":"const","name":"UNKNOWN_TYPE"}},"expr":{"id":6,"kind":"app","opcode":"iadd","args":[{"id":4,"kind":"name","name":"x"},{"id":5,"kind":"int","value":1}]}},"depth":0}},"errors":[{"explanation":"[QNT404] Type alias 'UNKNOWN_TYPE' not found","locs":[{"source":"mocked_path/testFixture/_1013unknownTypeLetIn.qnt","start":{"line":2,"col":11,"index":49},"end":{"line":2,"col":22,"index":60}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.json b/quint/testFixture/_1014conflictingNames.json index 1fb83d48e..9c471ccea 100644 --- a/quint/testFixture/_1014conflictingNames.json +++ b/quint/testFixture/_1014conflictingNames.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":19,"name":"conflictingNames","declarations":[{"id":11,"kind":"def","name":"size","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":9,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"int","value":0}}},{"id":13,"kind":"typedef","name":"T","type":{"id":12,"kind":"int"}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"str"}},{"id":17,"kind":"def","name":"b","qualifier":"def","expr":{"id":16,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5},{"id":18,"kind":"import","defName":"b","protoName":"M"},{"id":8,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"7":{"id":6,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"M","declarations":[{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2}}]},{"id":21,"name":"conflictingNames","declarations":[{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}}},{"id":15,"kind":"typedef","name":"T","type":{"id":14,"kind":"int"},"depth":0},{"id":17,"kind":"typedef","name":"T","type":{"id":16,"kind":"str"},"depth":0},{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1}},{"kind":"var","name":"a","typeAnnotation":{"id":4,"kind":"int"},"id":5,"depth":0},{"id":20,"kind":"import","defName":"b","protoName":"M"},{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}}}]}],"table":{"2":{"id":2,"kind":"def","name":"b","qualifier":"def","expr":{"id":1,"kind":"int","value":2},"depth":0},"7":{"id":6,"name":"x","kind":"param","depth":1},"9":{"id":9,"kind":"def","name":"a","qualifier":"def","expr":{"id":8,"kind":"lambda","params":[{"id":6,"name":"x"}],"qualifier":"def","expr":{"id":7,"kind":"name","name":"x"}},"depth":0},"13":{"id":13,"kind":"def","name":"size","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":10,"name":"x"}],"qualifier":"def","expr":{"id":11,"kind":"int","value":0}},"depth":0},"19":{"id":19,"kind":"def","name":"b","qualifier":"def","expr":{"id":18,"kind":"int","value":1},"depth":0}},"errors":[{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":6,"col":2,"index":73},"end":{"line":6,"col":12,"index":83}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'a' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":7,"col":2,"index":87},"end":{"line":7,"col":13,"index":98}}]},{"explanation":"[QNT101] Built-in name 'size' is redefined in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":10,"col":2,"index":142},"end":{"line":10,"col":16,"index":156}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":13,"col":2,"index":186},"end":{"line":13,"col":13,"index":197}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'T' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":14,"col":2,"index":201},"end":{"line":14,"col":13,"index":212}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":16,"col":2,"index":217},"end":{"line":16,"col":10,"index":225}}]},{"explanation":"[QNT101] Conflicting definitions found for name 'b' in module 'conflictingNames'","locs":[{"source":"mocked_path/testFixture/_1014conflictingNames.qnt","start":{"line":19,"col":2,"index":271},"end":{"line":19,"col":11,"index":280}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1014conflictingNames.map.json b/quint/testFixture/_1014conflictingNames.map.json index 0b3e07c7f..fe6459bd3 100644 --- a/quint/testFixture/_1014conflictingNames.map.json +++ b/quint/testFixture/_1014conflictingNames.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1014conflictingNames.qnt"},"map":{"1":[0,{"line":1,"col":10,"index":21},{"line":1,"col":10,"index":21}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":10,"index":21}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":23,"index":23}],"4":[0,{"line":6,"col":10,"index":81},{"line":6,"col":12,"index":83}],"5":[0,{"line":6,"col":2,"index":73},{"line":6,"col":12,"index":83}],"6":[0,{"line":7,"col":8,"index":93},{"line":7,"col":8,"index":93}],"7":[0,{"line":7,"col":13,"index":98},{"line":7,"col":13,"index":98}],"8":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"9":[0,{"line":10,"col":11,"index":151},{"line":10,"col":11,"index":151}],"10":[0,{"line":10,"col":16,"index":156},{"line":10,"col":16,"index":156}],"11":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"12":[0,{"line":13,"col":11,"index":195},{"line":13,"col":13,"index":197}],"13":[0,{"line":13,"col":2,"index":186},{"line":13,"col":13,"index":197}],"14":[0,{"line":14,"col":11,"index":210},{"line":14,"col":13,"index":212}],"15":[0,{"line":14,"col":2,"index":201},{"line":14,"col":13,"index":212}],"16":[0,{"line":16,"col":10,"index":225},{"line":16,"col":10,"index":225}],"17":[0,{"line":16,"col":2,"index":217},{"line":16,"col":10,"index":225}],"18":[0,{"line":19,"col":2,"index":271},{"line":19,"col":11,"index":280}],"19":[0,{"line":4,"col":0,"index":26},{"line":20,"col":256,"index":282}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1014conflictingNames.qnt"},"map":{"1":[0,{"line":1,"col":10,"index":21},{"line":1,"col":10,"index":21}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":10,"index":21}],"3":[0,{"line":0,"col":0,"index":0},{"line":2,"col":23,"index":23}],"4":[0,{"line":6,"col":10,"index":81},{"line":6,"col":12,"index":83}],"5":[0,{"line":6,"col":2,"index":73},{"line":6,"col":12,"index":83}],"6":[0,{"line":7,"col":8,"index":93},{"line":7,"col":8,"index":93}],"7":[0,{"line":7,"col":13,"index":98},{"line":7,"col":13,"index":98}],"8":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"9":[0,{"line":7,"col":2,"index":87},{"line":7,"col":13,"index":98}],"10":[0,{"line":10,"col":11,"index":151},{"line":10,"col":11,"index":151}],"11":[0,{"line":10,"col":16,"index":156},{"line":10,"col":16,"index":156}],"12":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"13":[0,{"line":10,"col":2,"index":142},{"line":10,"col":16,"index":156}],"14":[0,{"line":13,"col":11,"index":195},{"line":13,"col":13,"index":197}],"15":[0,{"line":13,"col":2,"index":186},{"line":13,"col":13,"index":197}],"16":[0,{"line":14,"col":11,"index":210},{"line":14,"col":13,"index":212}],"17":[0,{"line":14,"col":2,"index":201},{"line":14,"col":13,"index":212}],"18":[0,{"line":16,"col":10,"index":225},{"line":16,"col":10,"index":225}],"19":[0,{"line":16,"col":2,"index":217},{"line":16,"col":10,"index":225}],"20":[0,{"line":19,"col":2,"index":271},{"line":19,"col":11,"index":280}],"21":[0,{"line":4,"col":0,"index":26},{"line":20,"col":256,"index":282}]}} \ No newline at end of file diff --git a/quint/testFixture/_1015noToplevelNondet.json b/quint/testFixture/_1015noToplevelNondet.json index ca7559437..e897d1a56 100644 --- a/quint/testFixture/_1015noToplevelNondet.json +++ b/quint/testFixture/_1015noToplevelNondet.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":2,"name":"topLevelNondet","declarations":[]}],"table":{},"errors":[{"explanation":"[QNT000] mismatched input 'nondet' expecting {'}', 'const', 'var', 'assume', 'type', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'import', 'export', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/_1015noToplevelNondet.qnt","start":{"line":2,"col":2,"index":101},"end":{"line":2,"col":7,"index":106}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"topLevelNondet","declarations":[{"id":5,"kind":"def","name":"toplevelNondet","qualifier":"nondet","expr":{"id":4,"kind":"app","opcode":"oneOf","args":[{"id":3,"kind":"app","opcode":"to","args":[{"id":1,"kind":"int","value":1},{"id":2,"kind":"int","value":3}]}]}}]}],"table":{"5":{"id":5,"kind":"def","name":"toplevelNondet","qualifier":"nondet","expr":{"id":4,"kind":"app","opcode":"oneOf","args":[{"id":3,"kind":"app","opcode":"to","args":[{"id":1,"kind":"int","value":1},{"id":2,"kind":"int","value":3}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1016nonConstOverride.json b/quint/testFixture/_1016nonConstOverride.json index 617624975..16377145c 100644 --- a/quint/testFixture/_1016nonConstOverride.json +++ b/quint/testFixture/_1016nonConstOverride.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":5,"name":"A","declarations":[{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4}]},{"id":11,"name":"nonConstOverride","declarations":[{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false}]}],"table":{"8":{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":6,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]},"9":{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]}},"errors":[{"explanation":"[QNT406] Instantiation error: 'a' is not a constant in 'A'","locs":[{"source":"mocked_path/testFixture/_1016nonConstOverride.qnt","start":{"line":6,"col":2,"index":70},"end":{"line":6,"col":33,"index":101}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":5,"name":"A","declarations":[{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0}]},{"id":11,"name":"nonConstOverride","declarations":[{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false}]}],"table":{"8":{"kind":"const","name":"c","typeAnnotation":{"id":1,"kind":"int"},"id":6,"depth":0,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]},"9":{"kind":"var","name":"a","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0,"importedFrom":{"id":10,"kind":"instance","qualifiedName":"A1","protoName":"A","overrides":[[{"id":8,"name":"c"},{"id":6,"kind":"int","value":1}],[{"id":9,"name":"a"},{"id":7,"kind":"bool","value":false}]],"identityOverride":false},"hidden":true,"namespaces":["A1","nonConstOverride"]}},"errors":[{"explanation":"[QNT406] Instantiation error: 'a' is not a constant in 'A'","locs":[{"source":"mocked_path/testFixture/_1016nonConstOverride.qnt","start":{"line":6,"col":2,"index":70},"end":{"line":6,"col":33,"index":101}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1020importFrom.json b/quint/testFixture/_1020importFrom.json index 20f774a29..e677b042c 100644 --- a/quint/testFixture/_1020importFrom.json +++ b/quint/testFixture/_1020importFrom.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"importee2","declarations":[{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"}}]},{"id":10,"name":"importee1","declarations":[{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"}},{"id":9,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]},{"id":3,"name":"importer","declarations":[{"id":1,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"},{"id":2,"kind":"import","defName":"*","protoName":"importee1","fromSource":"./_1021importee1"}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":6,"name":"importee2","declarations":[{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"}}]},{"id":10,"name":"importee1","declarations":[{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"}},{"id":9,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]},{"id":3,"name":"importer","declarations":[{"id":1,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"},{"id":2,"kind":"import","defName":"*","protoName":"importee1","fromSource":"./_1021importee1"}]}],"table":{"5":{"id":5,"kind":"def","name":"name2","qualifier":"val","expr":{"id":4,"kind":"str","value":"importee2"},"depth":0},"8":{"id":8,"kind":"def","name":"name1","qualifier":"val","expr":{"id":7,"kind":"str","value":"importee1"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1021importee1.json b/quint/testFixture/_1021importee1.json index 3f8772f03..7199f3260 100644 --- a/quint/testFixture/_1021importee1.json +++ b/quint/testFixture/_1021importee1.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"importee2","declarations":[{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"}}]},{"id":4,"name":"importee1","declarations":[{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"}},{"id":3,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":7,"name":"importee2","declarations":[{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"}}]},{"id":4,"name":"importee1","declarations":[{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"}},{"id":3,"kind":"import","defName":"*","protoName":"importee2","fromSource":"./_1022importee2"}]}],"table":{"2":{"id":2,"kind":"def","name":"name1","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee1"},"depth":0},"6":{"id":6,"kind":"def","name":"name2","qualifier":"val","expr":{"id":5,"kind":"str","value":"importee2"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1022importee2.json b/quint/testFixture/_1022importee2.json index abca5472d..d01b33dc9 100644 --- a/quint/testFixture/_1022importee2.json +++ b/quint/testFixture/_1022importee2.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"importee2","declarations":[{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"}}]}],"table":{},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":3,"name":"importee2","declarations":[{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"}}]}],"table":{"2":{"id":2,"kind":"def","name":"name2","qualifier":"val","expr":{"id":1,"kind":"str","value":"importee2"},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index a182ffb1d..4c222cf7a 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":1}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"I","declarations":[{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}}}]}],"table":{"3":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true},"depth":2},"5":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":3},"7":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true},"depth":3},"9":{"id":9,"kind":"def","name":"x","qualifier":"val","expr":{"id":8,"kind":"let","opdef":{"id":3,"kind":"def","name":"y","qualifier":"val","expr":{"id":2,"kind":"bool","value":true}},"expr":{"id":4,"kind":"let","opdef":{"id":5,"kind":"def","qualifier":"val","name":"__undefinedExprGenerated","expr":{"id":6,"kind":"bool","value":true}},"expr":{"id":7,"kind":"name","name":"__undefinedExprGenerated"}}},"depth":0}},"errors":[{"explanation":"[QNT000] mismatched input '}' expecting {'{', '[', 'val', 'def', 'pure', 'action', 'run', 'temporal', 'nondet', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Map', 'match', '-', '(', 'Set', 'List', LOW_ID, CAP_ID}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.json b/quint/testFixture/_1030const.json index b18d403e1..e5f70e895 100644 --- a/quint/testFixture/_1030const.json +++ b/quint/testFixture/_1030const.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":10,"kind":"lambda","params":[{"id":3,"name":"i"}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":9,"kind":"oper","args":[{"id":4,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":3,"name":"i","kind":"param"},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":11,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}}}]}],"table":{"6":{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"},"kind":"param","depth":1},"7":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"10":{"id":10,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":9,"kind":"lambda","params":[{"id":4,"name":"i","typeAnnotation":{"id":3,"kind":"int"}}],"qualifier":"puredef","expr":{"id":8,"kind":"app","opcode":"iadd","args":[{"id":6,"kind":"name","name":"i"},{"id":7,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"int"}],"res":{"id":5,"kind":"int"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1030const.map.json b/quint/testFixture/_1030const.map.json index 889372b5d..c9eabe4f7 100644 --- a/quint/testFixture/_1030const.map.json +++ b/quint/testFixture/_1030const.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"4":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"2":[0,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"3":[0,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"4":[0,{"line":3,"col":15,"index":42},{"line":3,"col":20,"index":47}],"5":[0,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"6":[0,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"7":[0,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"8":[0,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"9":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"10":[0,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"11":[0,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.json b/quint/testFixture/_1031instance.json index 8816ad45f..7b66f056e 100644 --- a/quint/testFixture/_1031instance.json +++ b/quint/testFixture/_1031instance.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"id":16,"kind":"oper","args":[{"id":11,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":17,"kind":"lambda","params":[{"id":10,"name":"i"}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"13":{"id":10,"name":"i","kind":"param"},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"c","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}}}]},{"id":7,"name":"inst","declarations":[{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]}}]}],"table":{"2":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":1,"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"5":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"depth":0,"importedFrom":{"id":3,"kind":"instance","protoName":"c","overrides":[[{"id":2,"name":"N"},{"id":1,"kind":"int","value":3}]],"identityOverride":true,"fromSource":"./_1030const"},"hidden":true,"namespaces":["c","inst"]},"6":{"id":6,"kind":"def","name":"baz","qualifier":"puredef","expr":{"id":5,"kind":"app","opcode":"foo","args":[{"id":4,"kind":"int","value":6}]},"depth":0},"13":{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"},"kind":"param","depth":1},"14":{"kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},"17":{"id":17,"kind":"def","name":"foo","qualifier":"puredef","expr":{"id":16,"kind":"lambda","params":[{"id":11,"name":"i","typeAnnotation":{"id":10,"kind":"int"}}],"qualifier":"puredef","expr":{"id":15,"kind":"app","opcode":"iadd","args":[{"id":13,"kind":"name","name":"i"},{"id":14,"kind":"name","name":"N"}]}},"typeAnnotation":{"kind":"oper","args":[{"id":10,"kind":"int"}],"res":{"id":12,"kind":"int"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1031instance.map.json b/quint/testFixture/_1031instance.map.json index 257653256..8b27a9271 100644 --- a/quint/testFixture/_1031instance.map.json +++ b/quint/testFixture/_1031instance.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":15,"index":42},{"line":3,"col":15,"index":42}],"11":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1031instance.qnt","7":"mocked_path/testFixture/_1030const.qnt"},"map":{"1":[0,{"line":1,"col":15,"index":29},{"line":1,"col":15,"index":29}],"2":[0,{"line":1,"col":11,"index":25},{"line":1,"col":11,"index":25}],"3":[0,{"line":1,"col":2,"index":16},{"line":1,"col":38,"index":52}],"4":[0,{"line":3,"col":21,"index":76},{"line":3,"col":21,"index":76}],"5":[0,{"line":3,"col":17,"index":72},{"line":3,"col":22,"index":77}],"6":[0,{"line":3,"col":2,"index":57},{"line":3,"col":22,"index":77}],"7":[0,{"line":0,"col":0,"index":0},{"line":4,"col":79,"index":79}],"8":[7,{"line":1,"col":11,"index":22},{"line":1,"col":13,"index":24}],"9":[7,{"line":1,"col":2,"index":13},{"line":1,"col":13,"index":24}],"10":[7,{"line":3,"col":18,"index":45},{"line":3,"col":20,"index":47}],"11":[7,{"line":3,"col":15,"index":42},{"line":3,"col":20,"index":47}],"12":[7,{"line":3,"col":24,"index":51},{"line":3,"col":26,"index":53}],"13":[7,{"line":3,"col":30,"index":57},{"line":3,"col":30,"index":57}],"14":[7,{"line":3,"col":34,"index":61},{"line":3,"col":34,"index":61}],"15":[7,{"line":3,"col":30,"index":57},{"line":3,"col":34,"index":61}],"16":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"17":[7,{"line":3,"col":2,"index":29},{"line":3,"col":34,"index":61}],"18":[7,{"line":0,"col":0,"index":0},{"line":4,"col":63,"index":63}]}} \ No newline at end of file diff --git a/quint/testFixture/_1032docstrings.json b/quint/testFixture/_1032docstrings.json index 6bfc7ca63..d1ef2d5f3 100644 --- a/quint/testFixture/_1032docstrings.json +++ b/quint/testFixture/_1032docstrings.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":1}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"docstrings","declarations":[{"doc":"Docstring for var","kind":"var","name":"x","typeAnnotation":{"id":6,"kind":"int"},"id":7,"depth":0},{"doc":"Docstring for const","kind":"const","name":"N","typeAnnotation":{"id":8,"kind":"int"},"id":9,"depth":0},{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}}}],"doc":"Docstring for module"}],"table":{"2":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":2},"3":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1},"depth":2},"5":{"doc":"Top level docstring","id":5,"kind":"def","name":"nestedVals","qualifier":"val","expr":{"id":4,"kind":"let","opdef":{"id":2,"kind":"def","name":"foo","qualifier":"pureval","expr":{"id":1,"kind":"int","value":1}},"expr":{"id":3,"kind":"name","name":"foo"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1040compileError.json b/quint/testFixture/_1040compileError.json index a841f0e70..34614cfef 100644 --- a/quint/testFixture/_1040compileError.json +++ b/quint/testFixture/_1040compileError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":8,"name":"_1040compileError","declarations":[{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]}}]}],"table":{"3":{"kind":"const","name":"n","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"7":{"id":7,"kind":"def","name":"myTest","qualifier":"run","expr":{"id":6,"kind":"app","opcode":"assert","args":[{"id":5,"kind":"app","opcode":"igt","args":[{"id":3,"kind":"name","name":"n"},{"id":4,"kind":"int","value":0}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1041compileConst.json b/quint/testFixture/_1041compileConst.json index 3ea01a4eb..6e20291f3 100644 --- a/quint/testFixture/_1041compileConst.json +++ b/quint/testFixture/_1041compileConst.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":15,"name":"_1041compileConst","declarations":[{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]}},{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]}}]}],"table":{"5":{"kind":"const","name":"N","typeAnnotation":{"id":1,"kind":"int"},"id":2,"depth":0},"6":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"8":{"id":8,"kind":"def","name":"init","qualifier":"action","expr":{"id":7,"kind":"app","opcode":"assign","args":[{"id":6,"kind":"name","name":"x"},{"id":5,"kind":"name","name":"N"}]},"depth":0},"9":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"12":{"kind":"var","name":"x","typeAnnotation":{"id":3,"kind":"int"},"id":4,"depth":0},"14":{"id":14,"kind":"def","name":"step","qualifier":"action","expr":{"id":13,"kind":"app","opcode":"assign","args":[{"id":12,"kind":"name","name":"x"},{"id":11,"kind":"app","opcode":"isub","args":[{"id":9,"kind":"name","name":"x"},{"id":10,"kind":"int","value":1}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json index d235213b0..0c498d357 100644 --- a/quint/testFixture/_1042qualifiersInRecordsFieldsError.json +++ b/quint/testFixture/_1042qualifiersInRecordsFieldsError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":10,"name":"qualifiersInRecordFields","declarations":[{"id":5,"kind":"typedef","name":"T","type":{"id":4,"kind":"rec","fields":{"kind":"row","fields":[{"fieldName":"invalid::decl::label","fieldType":{"id":3,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]}}]}],"table":{"9":{"id":9,"kind":"def","name":"r","qualifier":"val","expr":{"id":8,"kind":"app","opcode":"Rec","args":[{"id":7,"kind":"str","value":"invalid::record::label"},{"id":6,"kind":"int","value":1}]},"depth":0}},"errors":[{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::decl::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":1,"col":33,"index":67},"end":{"line":1,"col":33,"index":67}}]},{"explanation":"[QNT008] Identifiers in a record cannot be qualified with '::'. Found invalid::record::label.","locs":[{"source":"mocked_path/testFixture/_1042qualifiersInRecordsFieldsError.qnt","start":{"line":2,"col":35,"index":110},"end":{"line":2,"col":35,"index":110}}]}]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json index 67982899d..a160f1be9 100644 --- a/quint/testFixture/_1043sumTypeDecl.json +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":21,"name":"SumTypes","declarations":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":3,"kind":"const","name":"T"}},"expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}}},{"id":7,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":3,"kind":"const","name":"T"},"expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]}},{"id":20,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":19,"kind":"app","opcode":"List","args":[{"id":16,"kind":"name","name":"A"},{"id":18,"kind":"app","opcode":"B","args":[{"id":17,"kind":"int","value":2}]}]},"typeAnnotation":{"id":15,"kind":"list","elem":{"id":14,"kind":"const","name":"T"}}}]}],"table":{"3":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"10":{"id":9,"name":"__BParam","kind":"param"},"14":{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},"16":{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"app","opcode":"variant","args":[{"id":4,"kind":"str","value":"A"},{"id":5,"kind":"app","opcode":"Rec","args":[]}]},"depth":0},"18":{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"app","opcode":"variant","args":[{"id":8,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":10}]}},"depth":0}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":22,"name":"SumTypes","declarations":[{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]}},{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}}}]}],"table":{"4":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"8":{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"11":{"id":10,"name":"__BParam","kind":"param","depth":1},"14":{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0},"15":{"id":3,"kind":"typedef","name":"T","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}},"depth":0},"17":{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"19":{"id":14,"kind":"def","name":"B","qualifier":"def","expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}},"depth":0},"21":{"id":21,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"List","args":[{"id":17,"kind":"name","name":"A"},{"id":19,"kind":"app","opcode":"B","args":[{"id":18,"kind":"int","value":2}]}]},"typeAnnotation":{"id":16,"kind":"list","elem":{"id":15,"kind":"const","name":"T"}},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json index 9d2b689b9..5d16f8502 100644 --- a/quint/testFixture/_1043sumTypeDecl.map.json +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"9":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"15":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"16":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"17":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"18":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"19":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"20":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"21":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"10":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"14":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"15":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"16":[0,{"line":5,"col":29,"index":80},{"line":5,"col":35,"index":86}],"17":[0,{"line":5,"col":44,"index":95},{"line":5,"col":44,"index":95}],"18":[0,{"line":5,"col":49,"index":100},{"line":5,"col":49,"index":100}],"19":[0,{"line":5,"col":47,"index":98},{"line":5,"col":50,"index":101}],"20":[0,{"line":5,"col":39,"index":90},{"line":5,"col":51,"index":102}],"21":[0,{"line":5,"col":2,"index":53},{"line":5,"col":51,"index":102}],"22":[0,{"line":0,"col":0,"index":0},{"line":6,"col":104,"index":104}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json index 6ceb3f033..24ade9562 100644 --- a/quint/testFixture/_1044matchExpression.json +++ b/quint/testFixture/_1044matchExpression.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":40,"name":"SumTypes","declarations":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":14,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":13,"kind":"lambda","params":[{"id":10,"name":"__BParam"}],"qualifier":"def","expr":{"id":12,"kind":"app","opcode":"variant","args":[{"id":9,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":11}]}}},{"id":20,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":4,"kind":"const","name":"T"}},"expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}}},{"id":8,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":4,"kind":"const","name":"T"},"expr":{"id":7,"kind":"app","opcode":"variant","args":[{"id":5,"kind":"str","value":"A"},{"id":6,"kind":"app","opcode":"Rec","args":[]}]}},{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]}},{"id":39,"kind":"def","name":"ex","qualifier":"val","expr":{"id":29,"kind":"app","opcode":"matchVariant","args":[{"id":24,"kind":"name","name":"c"},{"id":30,"kind":"str","value":"A"},{"id":31,"kind":"lambda","qualifier":"def","expr":{"id":25,"kind":"int","value":0},"params":[{"name":"_","id":32}]},{"id":33,"kind":"str","value":"B"},{"id":34,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"name","name":"n"},"params":[{"name":"n","id":35}]},{"id":36,"kind":"str","value":"_"},{"id":37,"kind":"lambda","qualifier":"def","expr":{"id":28,"kind":"app","opcode":"iuminus","args":[{"id":27,"kind":"int","value":1}]},"params":[{"name":"_","id":38}]}]}}]}],"table":{"4":{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},"11":{"id":10,"name":"__BParam","kind":"param"},"17":{"id":16,"name":"__CParam","kind":"param"},"22":{"id":20,"kind":"def","name":"C","qualifier":"def","expr":{"id":19,"kind":"lambda","params":[{"id":16,"name":"__CParam"}],"qualifier":"def","expr":{"id":18,"kind":"app","opcode":"variant","args":[{"id":15,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":17}]}},"depth":0},"24":{"id":23,"kind":"def","name":"c","qualifier":"val","expr":{"id":22,"kind":"app","opcode":"C","args":[{"id":21,"kind":"str","value":"Foo"}]},"depth":0},"26":{"name":"n","id":35,"kind":"param"}},"errors":[]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":41,"name":"SumTypes","declarations":[{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}}},{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}}},{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]}},{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]}},{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]}}]}],"table":{"5":{"id":4,"kind":"typedef","name":"T","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"tup","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}},"depth":0},"9":{"id":9,"kind":"def","name":"A","qualifier":"val","typeAnnotation":{"id":5,"kind":"const","name":"T"},"expr":{"id":8,"kind":"app","opcode":"variant","args":[{"id":6,"kind":"str","value":"A"},{"id":7,"kind":"app","opcode":"Tup","args":[]}]},"depth":0},"12":{"id":11,"name":"__BParam","kind":"param","depth":1},"15":{"id":15,"kind":"def","name":"B","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":2,"kind":"int"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":14,"kind":"lambda","params":[{"id":11,"name":"__BParam"}],"qualifier":"def","expr":{"id":13,"kind":"app","opcode":"variant","args":[{"id":10,"kind":"str","value":"B"},{"kind":"name","name":"__BParam","id":12}]}},"depth":0},"18":{"id":17,"name":"__CParam","kind":"param","depth":1},"21":{"id":21,"kind":"def","name":"C","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":3,"kind":"str"}],"res":{"id":5,"kind":"const","name":"T"}},"expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"23":{"id":21,"kind":"def","name":"C","qualifier":"def","expr":{"id":20,"kind":"lambda","params":[{"id":17,"name":"__CParam"}],"qualifier":"def","expr":{"id":19,"kind":"app","opcode":"variant","args":[{"id":16,"kind":"str","value":"C"},{"kind":"name","name":"__CParam","id":18}]}},"depth":0},"24":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"25":{"id":24,"kind":"def","name":"c","qualifier":"val","expr":{"id":23,"kind":"app","opcode":"C","args":[{"id":22,"kind":"str","value":"Foo"}]},"depth":0},"27":{"name":"n","id":36,"kind":"param","depth":1},"40":{"id":40,"kind":"def","name":"ex","qualifier":"val","expr":{"id":30,"kind":"app","opcode":"matchVariant","args":[{"id":25,"kind":"name","name":"c"},{"id":31,"kind":"str","value":"A"},{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"int","value":0},"params":[{"name":"_","id":33}]},{"id":34,"kind":"str","value":"B"},{"id":35,"kind":"lambda","qualifier":"def","expr":{"id":27,"kind":"name","name":"n"},"params":[{"name":"n","id":36}]},{"id":37,"kind":"str","value":"_"},{"id":38,"kind":"lambda","qualifier":"def","expr":{"id":29,"kind":"app","opcode":"iuminus","args":[{"id":28,"kind":"int","value":1}]},"params":[{"name":"_","id":39}]}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json index 5a444ca1c..19be73e13 100644 --- a/quint/testFixture/_1044matchExpression.map.json +++ b/quint/testFixture/_1044matchExpression.map.json @@ -1 +1 @@ -{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"10":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"16":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"22":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"23":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"24":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"25":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"26":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"27":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"28":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"29":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"30":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"40":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"11":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"15":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"16":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"17":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"19":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"20":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"21":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"22":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"23":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"24":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"25":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"26":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"27":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"28":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"29":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"30":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"31":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"32":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"33":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"34":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"35":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"36":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"37":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"38":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"39":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"40":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"41":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.json b/quint/testFixture/_1045polymorphicTypeDecl.json new file mode 100644 index 000000000..80bfdfe94 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.json @@ -0,0 +1 @@ +{"stage":"parsing","warnings":[],"modules":[{"id":36,"name":"m","declarations":[{"id":10,"kind":"typedef","name":"MapApp","type":{"id":9,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":7,"kind":"fun","arg":{"id":5,"kind":"var","name":"a"},"res":{"id":6,"kind":"var","name":"b"}}},{"fieldName":"1","fieldType":{"id":8,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a","b"],"depth":0},{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},{"id":4,"kind":"typedef","name":"MonoPair","type":{"id":3,"kind":"tup","fields":{"kind":"row","fields":[{"fieldName":"0","fieldType":{"id":1,"kind":"var","name":"a"}},{"fieldName":"1","fieldType":{"id":2,"kind":"var","name":"a"}}],"other":{"kind":"empty"}}},"params":["a"],"depth":0},{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}}},{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}}},{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]}}]}],"table":{"14":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"19":{"id":18,"name":"__OkParam","kind":"param","depth":1},"22":{"id":22,"kind":"def","name":"Ok","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":11,"kind":"var","name":"ok"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":21,"kind":"lambda","params":[{"id":18,"name":"__OkParam"}],"qualifier":"def","expr":{"id":20,"kind":"app","opcode":"variant","args":[{"id":17,"kind":"str","value":"Ok"},{"kind":"name","name":"__OkParam","id":19}]}},"depth":0},"25":{"id":24,"name":"__ErrParam","kind":"param","depth":1},"28":{"id":28,"kind":"def","name":"Err","qualifier":"def","typeAnnotation":{"kind":"oper","args":[{"id":12,"kind":"var","name":"err"}],"res":{"id":13,"kind":"app","ctor":{"id":14,"kind":"const","name":"Result"},"args":[{"id":15,"kind":"var","name":"ok"},{"id":16,"kind":"var","name":"err"}]}},"expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0},"32":{"id":13,"kind":"typedef","name":"Result","type":{"id":13,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"Ok","fieldType":{"id":11,"kind":"var","name":"ok"}},{"fieldName":"Err","fieldType":{"id":12,"kind":"var","name":"err"}}],"other":{"kind":"empty"}}},"params":["ok","err"],"depth":0},"34":{"id":28,"kind":"def","name":"Err","qualifier":"def","expr":{"id":27,"kind":"lambda","params":[{"id":24,"name":"__ErrParam"}],"qualifier":"def","expr":{"id":26,"kind":"app","opcode":"variant","args":[{"id":23,"kind":"str","value":"Err"},{"kind":"name","name":"__ErrParam","id":25}]}},"depth":0},"35":{"id":35,"kind":"def","name":"test","qualifier":"val","expr":{"id":34,"kind":"app","opcode":"Err","args":[{"id":33,"kind":"str","value":"my error"}]},"typeAnnotation":{"id":31,"kind":"app","ctor":{"id":32,"kind":"const","name":"Result"},"args":[{"id":29,"kind":"tup","fields":{"kind":"empty"}},{"id":30,"kind":"str"}]},"depth":0}},"errors":[]} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.map.json b/quint/testFixture/_1045polymorphicTypeDecl.map.json new file mode 100644 index 000000000..5e565a6e4 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.map.json @@ -0,0 +1 @@ +{"sourceIndex":{"0":"mocked_path/testFixture/_1045polymorphicTypeDecl.qnt"},"map":{"1":[0,{"line":1,"col":22,"index":33},{"line":1,"col":22,"index":33}],"2":[0,{"line":1,"col":25,"index":36},{"line":1,"col":25,"index":36}],"3":[0,{"line":1,"col":21,"index":32},{"line":1,"col":26,"index":37}],"4":[0,{"line":1,"col":2,"index":13},{"line":1,"col":26,"index":37}],"5":[0,{"line":2,"col":23,"index":62},{"line":2,"col":23,"index":62}],"6":[0,{"line":2,"col":28,"index":67},{"line":2,"col":28,"index":67}],"7":[0,{"line":2,"col":23,"index":62},{"line":2,"col":28,"index":67}],"8":[0,{"line":2,"col":31,"index":70},{"line":2,"col":31,"index":70}],"9":[0,{"line":2,"col":22,"index":61},{"line":2,"col":32,"index":71}],"10":[0,{"line":2,"col":2,"index":41},{"line":2,"col":32,"index":71}],"11":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"12":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"13":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"14":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"15":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"16":[0,{"line":3,"col":2,"index":75},{"line":5,"col":51,"index":124}],"17":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"18":[0,{"line":4,"col":9,"index":107},{"line":4,"col":10,"index":108}],"19":[0,{"line":4,"col":6,"index":104},{"line":4,"col":7,"index":105}],"20":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"21":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"22":[0,{"line":4,"col":6,"index":104},{"line":4,"col":11,"index":109}],"23":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"24":[0,{"line":5,"col":10,"index":121},{"line":5,"col":12,"index":123}],"25":[0,{"line":5,"col":6,"index":117},{"line":5,"col":8,"index":119}],"26":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"27":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"28":[0,{"line":5,"col":6,"index":117},{"line":5,"col":13,"index":124}],"29":[0,{"line":6,"col":19,"index":145},{"line":6,"col":20,"index":146}],"30":[0,{"line":6,"col":23,"index":149},{"line":6,"col":25,"index":151}],"31":[0,{"line":6,"col":12,"index":138},{"line":6,"col":26,"index":152}],"32":[0,{"line":6,"col":12,"index":138},{"line":6,"col":26,"index":152}],"33":[0,{"line":6,"col":34,"index":160},{"line":6,"col":43,"index":169}],"34":[0,{"line":6,"col":30,"index":156},{"line":6,"col":44,"index":170}],"35":[0,{"line":6,"col":2,"index":128},{"line":6,"col":44,"index":170}],"36":[0,{"line":0,"col":0,"index":0},{"line":7,"col":172,"index":172}]}} \ No newline at end of file diff --git a/quint/testFixture/_1045polymorphicTypeDecl.qnt b/quint/testFixture/_1045polymorphicTypeDecl.qnt new file mode 100644 index 000000000..205d0e4b0 --- /dev/null +++ b/quint/testFixture/_1045polymorphicTypeDecl.qnt @@ -0,0 +1,8 @@ +module m { + type MonoPair[a] = (a, a) + type MapApp[a, b] = (a -> b, a) + type Result[ok, err] = + | Ok(ok) + | Err(err) + val test: Result[(), str] = Err("my error") +} diff --git a/quint/testFixture/_1054sumTypesInItf.qnt b/quint/testFixture/_1054sumTypesInItf.qnt new file mode 100644 index 000000000..c5445f2a9 --- /dev/null +++ b/quint/testFixture/_1054sumTypesInItf.qnt @@ -0,0 +1,9 @@ +// Regression test for https://github.com/informalsystems/quint/issues/1281 +// ITF export did not have support for sum types +module sum { + type T = None | Some(int) + var x: T + action init = x' = None + action step = x' = match x { None => Some(1) | Some(n) => Some(n+1) } + run xTest = init.then(step).then(step).then(step) +} diff --git a/quint/testFixture/_1060case.qnt b/quint/testFixture/_1060case.qnt new file mode 100644 index 000000000..a88d15b2f --- /dev/null +++ b/quint/testFixture/_1060case.qnt @@ -0,0 +1,4 @@ +module caseSensitive { + import importee2 as i from "_1022importee2" + import importee2 as I from "_1022IMPORTEE2" +} diff --git a/quint/testFixture/modulesAndJunk.json b/quint/testFixture/modulesAndJunk.json index 93f7486b6..a16d6f974 100644 --- a/quint/testFixture/modulesAndJunk.json +++ b/quint/testFixture/modulesAndJunk.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":5,"name":"x"}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"id":11,"kind":"oper","args":[{"id":6,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"8":{"id":5,"name":"x","kind":"param"}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"modules":[{"id":13,"name":"bar","declarations":[{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}}}]},{"id":4,"name":"foo","declarations":[{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1}}]}],"table":{"3":{"id":3,"kind":"def","name":"x","qualifier":"val","expr":{"id":2,"kind":"int","value":1},"depth":0},"8":{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"},"kind":"param","depth":1},"12":{"id":12,"kind":"def","name":"baz","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":6,"name":"x","typeAnnotation":{"id":5,"kind":"int"}}],"qualifier":"def","expr":{"id":10,"kind":"app","opcode":"iadd","args":[{"id":8,"kind":"name","name":"x"},{"id":9,"kind":"int","value":1}]}},"typeAnnotation":{"kind":"oper","args":[{"id":5,"kind":"int"}],"res":{"id":7,"kind":"int"}},"depth":0}},"errors":[{"explanation":"[QNT000] extraneous input 'the' expecting {, 'module', DOCCOMMENT}","locs":[{"source":"mocked_path/testFixture/modulesAndJunk.qnt","start":{"line":8,"col":0,"index":75},"end":{"line":8,"col":2,"index":77}}]}]} \ No newline at end of file diff --git a/tutorials/blogpost0-secretsanta/secret_santa.org b/tutorials/blogpost0-secretsanta/secret_santa.org new file mode 100644 index 000000000..4edc24063 --- /dev/null +++ b/tutorials/blogpost0-secretsanta/secret_santa.org @@ -0,0 +1,363 @@ +* Holiday protocols: secret santa with Quint 🎅 + +Hi everyone, and happy holiday season! I'm Gabriela, I work on [[https://github.com/informalsystems/quint][Quint]], and today I'll walk you through my end-of-the-year holiday experiment: writing a specification for the secret santa game :santa:. + +Secret santa is a game for trading presents between participants. We write down the participants' names on individual pieces of paper, fold them, and put them in a bowl. The bowl is passed around to the participants, with each of them taking one piece of paper from the bowl, deciding the person the picker should gift a present to. This goes on until the bowl is empty, and everyone has someone to gift :gift:. + +I played this game at least once a year since I was a little kid, and well, different groups have different standards for the drawing process. I'm always one of the (potentially annoying) people who will make everyone play by the safest rules (well, that applies to many other scenarios, and I guess that's how I ended up working on Quint :grimacing:). So welcome aboard if you are one of these people too, and if you are not, this blogpost might introduce some complications for your next secret santa game. + +Disclaimer: This is not a super didactic tutorial, but rather a fun example of how I personally appreciate Quint (or formal specification in general). If you are looking for tutorials, we have some better introductory material [[https://github.com/informalsystems/quint/tree/main/tutorials][here]], and more documentation [[https://github.com/informalsystems/quint/tree/main/doc][here]]. In any way, I still recommend skimming through this as a potential motivational material :heart:. + +The complete spec described here is available in the [[https://github.com/informalsystems/quint/tree/main/examples/games/secret-santa/secret_santa.qnt][examples folder]]. + +** Basic secret santa + +Let's start with the basics: we have a =bowl= of recipient names. As each +participant draws its recipient, we record the drawn name in a map called +=recipient_for_santa=. The keys of the map are the santas giving gifts, and the +values are the gift-receivers for each santa. Those will be our two *state +variables*, meaning we'll be changing their values as the game progresses. +The set of participants in the game is a constant, which can be seen as +a module parameter (more on that later). + +We also import a library with some utility functions. The import statement +should point to the [[https://github.com/informalsystems/quint/blob/main/examples/spells/basicSpells.qnt][basicSpells.qnt]] file, from the quint repo, on your local file +system. + +#+begin_src bluespec +module secret_santa { + import basicSpells.* from "../../spells/basicSpells" + + const participants: Set[str] + + /// A map from santas to their recipients. get(recipient_for_santa, S) is the recipient for secret santa S + var recipient_for_santa: str -> str + + /// The bowl of participants, containing a paper piece for each participant's name + var bowl: Set[str] +} +#+end_src + +Now that we have the state variables, we need to specify their values in the initial state: +#+begin_src bluespec +/// The initial state +action init = all { + recipient_for_santa' = Map(), // No santas or recipients + bowl' = participants, // Every participant's name in the bowl +} +#+end_src + + +The following definitions are helpers: the set of santas are the keys of the =recipent_for_santa= map, while the recipients are the values of that map. These values are not fixed. Rather, they work as projections, or views, on the current state. When the values for the =recipient_for_santa= state variable change, the values for these helpers will change as well. +#+begin_src bluespec +val santas = recipient_for_santa.keys() +val recipients = recipient_for_santa.values() +#+end_src + +Finally, we define the system's transitions, which is just the drawing process. At each step, we non-deterministically pick the participant who is going to draw, and then, non-deterministically, draw one of the names from the bowl. We register that on our =recipient_for_santa= map and remove the drawn name from the bowl. When the bowl gets empty, we still need to define what happens. In this case, the drawing is over, and all state variables will stay the same - at least until the next holidays :christmas_tree:. When no variables change, we call that a =stutter= step. + +#+begin_src bluespec +action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + recipient_for_santa' = put(recipient_for_santa, santa, recipient), + bowl' = bowl.setRemove(recipient), + } +} + +action stutter = all { + recipient_for_santa' = recipient_for_santa, + bowl' = bowl, +} + +action step = + if (empty(bowl)) { + stutter + } else { + nondet next_santa = participants.exclude(santas).oneOf() + draw_recipient(next_santa) + } +#+end_src + +This is a very basic protocol, but already ensures one of the properties I'm +interested in: no sad kids with no presents at the revelation - everyone gets a +santa. That is, if the bowl is empty. In other words, the bowl being empty +*implies* that all the participants will receive gifts :gift:. + +#+begin_src bluespec +val everyone_gets_a_santa = empty(bowl) implies (participants == recipients) +#+end_src + +Before we can check that our spec satisfies this property, we need to define a +value for our module's constant. Constants are parameters to a module, so we need +to instantiate that module and specify the =participants=. Let's use the Quint +developer team as an example! + +#+begin_src bluespec +module secret_santa { + // ... all the code from before +} + +module quint_team_secret_santa { + import secret_santa(participants = Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")).* +} +#+end_src + +Now we can use Quint's =verify= command to check that all possible executions +(up to a certain length -- 10 steps, by default) satisfy this property for the =quint_team_secret_santa= module. + +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=everyone_gets_a_santa +#+end_src + +We get a successful result - the property holds! +#+begin_src sh +[ok] No violation found (2119ms). +You may increase --max-steps. +#+end_src + +Let's try a different property! People don't really want to buy themselves +presents. /Well, perhaps except for that teenage cousin who would rather not be +playing, but their mom forced them to. But let's not consider that./ So let's +write a property stating that, for each santa, they are not their own recipient. +#+begin_src bluespec +val no_person_is_self_santa = santas.forall(santa => + get(recipient_for_santa, santa) != santa +) +#+end_src + +And then check that property: +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=no_person_is_self_santa +#+end_src + +This time, we find out that the property does *not* hold! Quint provides us with a minimal counterexample. +#+begin_src bluespec +An example execution: + +[State 0] { quint_team_secret_santa::secret_santa::bowl: Set("Gabriela", "Igor", "Jure", "Shon", "Thomas"), quint_team_secret_santa::secret_santa::recipient_for_santa: Map() } + +[State 1] { quint_team_secret_santa::secret_santa::bowl: Set("Igor", "Jure", "Shon", "Thomas"), quint_team_secret_santa::secret_santa::recipient_for_santa: Map("Gabriela" -> "Gabriela") } + +[violation] Found an issue (2068ms). +error: found a counterexample +#+end_src + +In this example, Gabriela (that's me) got themself in the very first draw and would have to buy their own present. Not great! + +A better secret santa game has an additional, currently unspecified, step: after +a person draws a name from the bowl, they should confirm that they didn't get +themself before the drawing can continue. If someone draws themself, one of two strategies can take place: + 1. They immediately put their name back and draw again. + 2. The whole game gets reset: everyone who has already drawn a paper puts it back, and it all starts again. + +I want to try both strategies in Quint, and then show how (2) is better than (1). Usually, people don't want to reset the whole thing and get tempted to do (1), and that's when I say "no no no no no". Well, now I can show them the Quint spec and counterexamples, and they won't have any arguments! But first, let's add the confirmation step to our existing spec, which will be used by both strategies. + +First, we add a variable and change our =init= definition to include an initialization for it. We should also make sure it also stutters in our =stutter= helper definition. +#+begin_src bluespec +/// Information about the last draw +type LastDraw = + | Self(str) // The name of someone who drew themself + | Ok // The draw was Ok + +var last_draw: LastDraw + +action init = all { + // ... + last_draw' = Ok // if no one has drawn yet, no one has drawn themself +} + +action stutter = all { + // ... + last_draw' = last_draw, +} +#+end_src + +Then, we update the =draw_recipent= action to include the confirmation, that is, =last_draw= should be updated to the participant who drew, and its confirmed value should be true if and only if the participant got someone other than themself. +#+begin_src bluespec +action draw_recipient(santa: str): bool = { + nondet recipient = oneOf(bowl) + all { + // ... + last_draw' = if (santa == recipient) Self(santa) else Ok +} +#+end_src + +With this variable in place, we can now write a new invariant stating that our predicate =no_person_is_self_santa= should be satisfied if the last draw was ok. That is, the condition *implies* the predicate. +#+begin_src bluespec +val inv = (last_draw == Ok) implies no_person_is_self_santa +#+end_src + +Defining the variable on its own doesn't help us with satisfying that property, +tho. We need to define a strategy to deal with scenarios where the last draw +didn't turn out right. + +** Secret santa with the redraw strategy + +In this strategy, when a participant draws themself, they should pick another name. They can either first put their name back in the bowl, and then redraw; or first redraw and then put their name back, ensuring they won't get themself again. Both of them should work the same in the end, since we are not considering efficiency here. But let's define the latter. + +#+begin_src bluespec +action redraw(participant: str): bool = { + // Draw from the current bowl, without having first put paper back + nondet new_recipient = oneOf(bowl) + all { + new_recipient != participant, // The action requires this precondition + // Remove the new paper from the bowl, and then put the old one back in + bowl' = bowl.exclude(Set(new_recipient)).union(Set(participant)), + recipient_for_santa' = recipient_for_santa.put(participant, new_recipient), + last_draw' = Ok // We know this is OK due to the precondition + } +} +#+end_src + +We should call the redraw action whenever we find a self-draw. It is important to ensure that the bowl is not empty when we call that action since we need at least one name in the bowl to be drawn. +#+begin_src bluespec +action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + not(empty(bowl)), + redraw(participant), + } + } +#+end_src + +Let's check if our new invariant =inv= (defined as =(last_draw == Ok) implies no_person_is_self_santa=) is satisfied with our new step definition. We now have to specify our step definition with =--step=step_with_redraw=, otherwise, Quint will use the default name =step=. +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=inv --step=step_with_redraw +#+end_src + +The property is successfully checked. +#+begin_src sh +[ok] No violation found (4360ms). +#+end_src + +** Secret santa with the reset strategy + +In the reset strategy, we restart the whole game when some confirmation is negative. The definition looks quite nice! We could define this in a different module and plug everything together with import statements - but let's keep things simpler here and define yet another step action called =step_with_reset=. +#+begin_src bluespec +action step_with_reset = + if (last_draw == Ok) { + step + } else { + init + } +#+end_src + +Now, let's check the property. +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=inv --step=step_with_reset +#+end_src + +The property is successfully checked. +#+begin_src sh +[ok] No violation found (2492ms). +#+end_src + +** Redrawing is not good enough! + +Although both strategies can guarantee that, if the last draw was confirmed, then no person is their own santa, I still see two scenarios where the redraw strategy might have problems, while the reset strategy does not. +1. If the player who draws themself is the last player, and the bowl gets empty, there is nothing to be done to solve the issue. +2. If some of the players have a good memory and pay attention, they will have information about who may and may not be someone's santa, and even potentially find out who is a santa of someone, or their own santa! We need to preserve the "secret" part of this game! + +To show how (1) can happen, we should use temporal properties. However, since that requires a deeper explanation, and the tooling for it is not the most stable at the moment, I'll leave this one for next year. Instead, let's play around with (2). + +(2) does not need all the players to have a great memory, so let's say only I (Gabriela) am actually paying attention and memorizing some stuff. For that, let's introduce my memory as a state variable. +#+begin_src bluespec +/// Who had already drawn a paper when someone got themself. This way, I know +/// that none of those people can be the santa of the person who is drawing. +var gabrielas_memory: str -> Set[str] +#+end_src + +This is what I will be memorizing during the game: for each person that gets themself, who has already drawn by the time they got themself. Let's think of an example, using the Quint team as the set of participants (that is =Set("Gabriela", "Igor", "Jure", "Shon", "Thomas")=): Let's say Shon draws and confirms, then Igor draws and confirms, then Thomas draws and makes a negative confirmation. At that point, I know that neither Shon nor Igor had drawn Thomas, otherwise, the paper with Thomas' name wouldn't be in the bowl when he drew. So my memory map becomes =Map("Thomas" -> Set("Shon", "Igor", "Thomas"))=, which tells me that neither Shon nor Igor is Thomas' santa. Thomas themself is also part of the set because that makes things easier to represent, but we could also choose to remove the participant themself from the set. + +This memorization is only relevant in the redraw strategy, as the reset strategy reinitializes the whole process on self-sdraws, making any memorization useless from that point on. Therefore, let's only play with memorization in the redraw version. For that let's define how the memory variable is initialized and updated: + +#+begin_src bluespec +action init = all { + // ... + gabrielas_memory' = Map(), +} + +action draw_recipient(santa: str): bool = { + // ... + all { + // ..., + gabrielas_memory' = gabrielas_memory, // Nothing to memorize, so the memory stays the same + } +} + +action stutter = all { + // ... + gabrielas_memory' = gabrielas_memory, +} + +// Store current santas (people who have already drawn) on a participant's key, meaning that they can't be that participant's santa +action memorize(participant) = { + gabrielas_memory' = put(gabrielas_memory, participant, santas) +} + +action step_with_redraw = + match last_draw { + | Ok => + step // All good, continue as usual + | Self(participant) => all { + // ..., + memorize(participant), + } + } +#+end_src + +*** Is there a scenario where I find out who is someone's santa? + +Now let's define a property that is true when I am able to deduce someone's +santa: + +#+begin_src bluespec +/// true iff Gabriela can find out who is a santa for someone. +/// That is, if exists a participant where find_out_a_santa_for participant is Some() +val gabriela_finds_out_a_santa = participants.exists(participant => { + if (gabrielas_memory.has(participant)) { + val possible_santas = participants.exclude(gabrielas_memory.get(participant)) + possible_santas.size() == 1 + } else { + false + } +}) +#+end_src + +Finally, the invariant we want to check is that Gabriela should NOT be able to find out a santa. +#+begin_src bluespec +val safe_from_memorizers = not(gabriela_finds_out_a_santa) +#+end_src + +Let's verify it, with the redraw version of =step_for_confirmation= +#+begin_src sh +quint verify secret_santa.qnt --main=quint_team_secret_santa --invariant=safe_from_memorizers --step=step_with_redraw +#+end_src + +We get a violation! After 5 steps, we get to a point where I know that Shon is my santa :santa: +#+begin_src bluespec +... +[State 5] +{ + quint_team_secret_santa::secret_santa::bowl: Set("Gabriela"), + quint_team_secret_santa::secret_santa::gabrielas_memory: + Map("Gabriela" -> Set("Gabriela", "Igor", "Jure", "Thomas")), + quint_team_secret_santa::secret_santa::last_draw: Ok, + quint_team_secret_santa::secret_santa::recipient_for_santa: + Map("Jure" -> "Igor", "Igor" -> "Thomas", "Gabriela" -> "Jure", "Thomas" -> "Shon") +} + +[violation] Found an issue (2628ms). +error: found a counterexample +#+end_src + +On state 5, my memory is =Map("Gabriela" -> Set("Gabriela", "Igor", "Jure", "Thomas"))=, so only Shon can possibly be my (non-secret) santa! + +Here, we only checked for the presence of the worst scenario: finding out someone's santa. This only happens if the second to last person redraws, and therefore their name is the only one in the bowl when the last person (in this case, Shon) draws. However, memorizers can also find partial information that can also ruin the game a bit, i.e. knowing for sure that a person who always gives the best gifts couldn't possibly have drawn me - that's a bummer, right? + +Well, what actually bothers me is having possible flaws in the drawing protocol like this, and that's why every year I insist on the reset strategy. There are some other interesting properties of secret santa that I'd like to explore, especially in the revelation procedure. But it's almost Christmas already, which means it's time for me to get ready for some beach time: I'm in Brazil, and we get Christmas during summer, and that's my favorite time of the year :sunny:. So let's talk about secret santa Quint specs again next year. + +Wish you all a happy holiday season and a lovely new year! diff --git a/tutorials/repl/repl.md b/tutorials/repl/repl.md index 66757d574..54069bcf7 100644 --- a/tutorials/repl/repl.md +++ b/tutorials/repl/repl.md @@ -40,7 +40,7 @@ state machine that describes how it works from the user's point of view: ## 1. Installation -You have to install `quint` first. See [README](../quint/README.md). +You have to install `quint` first. See the [README](../../README.md#installation). ## 2. Running REPL diff --git a/vscode/quint-vscode/CHANGELOG.md b/vscode/quint-vscode/CHANGELOG.md index 616b0a70b..d6937519b 100644 --- a/vscode/quint-vscode/CHANGELOG.md +++ b/vscode/quint-vscode/CHANGELOG.md @@ -14,6 +14,144 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed ### Security +## v0.14.3 -- 2024-05-14 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.14.2 -- 2024-05-07 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.14.1 -- 2024-04-09 + +### Added +### Changed + +- Updated the logo + +### Deprecated +### Removed +### Fixed +### Security + +## v0.14.0 -- 2024-03-26 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.7 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.6 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.5 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.4 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.3 -- 2024-02-08 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.2 -- 2024-01-26 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.1 -- 2024-01-16 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.13.0 -- 2024-01-03 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.12.2 -- 2023-12-19 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.12.1 -- 2023-12-05 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + +## v0.12.0 -- 2023-12-04 + +### Added +### Changed +### Deprecated +### Removed +### Fixed +### Security + ## v0.11.0 -- 2023-11-20 ### Added diff --git a/vscode/quint-vscode/icons/logo-dark.png b/vscode/quint-vscode/icons/logo-dark.png new file mode 100644 index 000000000..9cf93ffe9 Binary files /dev/null and b/vscode/quint-vscode/icons/logo-dark.png differ diff --git a/vscode/quint-vscode/icons/logo-dark.svg b/vscode/quint-vscode/icons/logo-dark.svg new file mode 100644 index 000000000..02dd4820d --- /dev/null +++ b/vscode/quint-vscode/icons/logo-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vscode/quint-vscode/icons/logo-light.png b/vscode/quint-vscode/icons/logo-light.png new file mode 100644 index 000000000..ebe58ea30 Binary files /dev/null and b/vscode/quint-vscode/icons/logo-light.png differ diff --git a/vscode/quint-vscode/icons/logo-light.svg b/vscode/quint-vscode/icons/logo-light.svg new file mode 100644 index 000000000..0e218eca8 --- /dev/null +++ b/vscode/quint-vscode/icons/logo-light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vscode/quint-vscode/icons/logo.png b/vscode/quint-vscode/icons/logo.png new file mode 100644 index 000000000..563a196a6 Binary files /dev/null and b/vscode/quint-vscode/icons/logo.png differ diff --git a/vscode/quint-vscode/package-lock.json b/vscode/quint-vscode/package-lock.json index 595989342..d90b5c70d 100644 --- a/vscode/quint-vscode/package-lock.json +++ b/vscode/quint-vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "quint-vscode", - "version": "0.11.0", + "version": "0.14.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "quint-vscode", - "version": "0.11.0", + "version": "0.14.3", "hasInstallScript": true, "dependencies": { "vscode-languageclient": "^7.0.0" diff --git a/vscode/quint-vscode/package.json b/vscode/quint-vscode/package.json index f81ecb1a4..d61398080 100644 --- a/vscode/quint-vscode/package.json +++ b/vscode/quint-vscode/package.json @@ -2,7 +2,8 @@ "name": "quint-vscode", "displayName": "Quint", "description": "Language support for Quint specifications", - "version": "0.11.0", + "icon": "./icons/logo.png", + "version": "0.14.3", "publisher": "informal", "engines": { "vscode": "^1.52.0" @@ -32,7 +33,11 @@ "extensions": [ ".qnt" ], - "configuration": "./language-configuration.json" + "configuration": "./language-configuration.json", + "icon": { + "light": "./icons/logo-dark.png", + "dark": "./icons/logo-light.png" + } } ], "grammars": [ diff --git a/vscode/quint-vscode/server/README.md b/vscode/quint-vscode/server/README.md index e27840ded..bf57df19d 100644 --- a/vscode/quint-vscode/server/README.md +++ b/vscode/quint-vscode/server/README.md @@ -18,6 +18,6 @@ There are currently three clients for this server: 1. The Quint [VSCode extension](https://marketplace.visualstudio.com/items?itemName=informal.quint-vscode) 2. The [Quint LSP client](https://github.com/informalsystems/quint/blob/main/editor-plugins/emacs/README.md) for Emacs -3. A [Neovim LSP client]((https://github.com/informalsystems/quint/blob/main/editor-plugins/vim/README.md) +3. A [Neovim LSP client](https://github.com/informalsystems/quint/blob/main/editor-plugins/vim/README.md) (1) and (2) are capable of downloading and installing this server for you. (3) requires manual installation (for now). diff --git a/vscode/quint-vscode/server/package-lock.json b/vscode/quint-vscode/server/package-lock.json index 61fca0374..321c6d4fe 100644 --- a/vscode/quint-vscode/server/package-lock.json +++ b/vscode/quint-vscode/server/package-lock.json @@ -1,15 +1,15 @@ { "name": "@informalsystems/quint-language-server", - "version": "0.11.0", + "version": "0.14.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@informalsystems/quint-language-server", - "version": "0.11.0", + "version": "0.14.3", "license": "Apache 2.0", "dependencies": { - "@informalsystems/quint": "^0.16.0", + "@informalsystems/quint": "^0.19.4", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" @@ -355,25 +355,25 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.2.tgz", - "integrity": "sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": "^8.13.0 || >=10.10.0" + "node": ">=12.10.0" } }, "node_modules/@grpc/proto-loader": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", - "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { @@ -476,9 +476,9 @@ "dev": true }, "node_modules/@informalsystems/quint": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.16.0.tgz", - "integrity": "sha512-5581KQ7hKj8xMdNaJ7bssF4W3BrOO+tdFaTSueJwqHIE1UgTKqeC6CLCRLp1j+YDEk7w/LEUiY9rC4GiKjExtA==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", + "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", "dependencies": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -486,6 +486,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -494,8 +495,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -504,7 +505,7 @@ "quint": "dist/src/cli.js" }, "engines": { - "node": ">=18" + "node": "18 - 20" } }, "node_modules/@informalsystems/quint/node_modules/cliui": { @@ -614,6 +615,15 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -650,12 +660,11 @@ } }, "node_modules/@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dependencies": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -663,19 +672,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "node_modules/@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dependencies": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" }, "engines": { @@ -683,11 +691,11 @@ } }, "node_modules/@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dependencies": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, @@ -696,11 +704,11 @@ } }, "node_modules/@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@protobufjs/aspromise": { @@ -821,15 +829,22 @@ "dev": true }, "node_modules/@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "node_modules/@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/mocha": { "version": "8.2.3", @@ -840,12 +855,13 @@ "node_modules/@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "node_modules/@types/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "node_modules/@types/semver": { "version": "7.3.13", @@ -4622,9 +4638,9 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -4891,14 +4907,6 @@ "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5129,6 +5137,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -5445,25 +5458,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -5763,9 +5757,9 @@ } }, "node_modules/protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -5786,9 +5780,12 @@ } }, "node_modules/protobufjs/node_modules/@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/punycode": { "version": "2.1.1", @@ -6350,9 +6347,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -6421,11 +6418,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -6572,10 +6564,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/uri-js": { "version": "4.4.1", @@ -6666,20 +6663,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7118,22 +7101,22 @@ } }, "@grpc/grpc-js": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.2.tgz", - "integrity": "sha512-Lf2pUhNTaviEdEaGgjU+29qw3arX7Qd/45q66F3z1EV5hroE6wM9xSHPvjB8EY+b1RmKZgwnLWXQorC6fZ9g5g==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", "requires": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" } }, "@grpc/proto-loader": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", - "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "requires": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", - "protobufjs": "^7.2.4", + "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "dependencies": { @@ -7207,9 +7190,9 @@ "dev": true }, "@informalsystems/quint": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.16.0.tgz", - "integrity": "sha512-5581KQ7hKj8xMdNaJ7bssF4W3BrOO+tdFaTSueJwqHIE1UgTKqeC6CLCRLp1j+YDEk7w/LEUiY9rC4GiKjExtA==", + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@informalsystems/quint/-/quint-0.19.4.tgz", + "integrity": "sha512-J2EfZRQHIjlOnHx1NvP4I+5egtw2QpYZjswxyUvWOdHShX7w9CXLkIksjFcPLdId1mkiN+zhjRHbm3V2l2Q25g==", "requires": { "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.7", @@ -7217,6 +7200,7 @@ "@sweet-monads/either": "~3.2.0", "@sweet-monads/maybe": "~3.2.0", "@types/line-column": "^1.0.0", + "@types/lodash.clonedeep": "4.5.0", "@types/seedrandom": "^3.0.4", "antlr4ts": "^0.5.0-alpha.4", "chalk": "^4.1.2", @@ -7225,8 +7209,8 @@ "json-bigint": "^1.0.0", "line-column": "^1.0.2", "lodash": "^4.17.21", + "lodash.clonedeep": "4.5.0", "lodash.isequal": "^4.5.0", - "node-fetch": "^2.6.13", "seedrandom": "^3.0.5", "tar": "^6.1.14", "yargs": "^17.2.1" @@ -7317,6 +7301,11 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7344,48 +7333,46 @@ } }, "@octokit/endpoint": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", - "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "requires": { - "@octokit/types": "^11.0.0", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "@octokit/openapi-types": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", - "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "@octokit/request": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", - "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "requires": { - "@octokit/endpoint": "^9.0.0", - "@octokit/request-error": "^5.0.0", - "@octokit/types": "^11.1.0", - "is-plain-object": "^5.0.0", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "@octokit/request-error": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", - "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "requires": { - "@octokit/types": "^11.0.0", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/types": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", - "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", "requires": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "@protobufjs/aspromise": { @@ -7506,15 +7493,22 @@ "dev": true }, "@types/line-column": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.0.tgz", - "integrity": "sha512-wbw+IDRw/xY/RGy+BL6f4Eey4jsUgHQrMuA4Qj0CSG3x/7C2Oc57pmRoM2z3M4DkylWRz+G1pfX06sCXQm0J+w==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-099oFQmp/Tlf20xW5XI5R4F69N6lF/zQ09XDzc3R5BOLFlqIotgKoNIyj0HD4fQLWcGDreDJv8k/BkLJscrDrw==" }, "@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==", - "dev": true + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "@types/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-IHijjFVPJTvzvrNPz+6nQy5lZQb7uh807RfTIEaQBrZXrIGjZy0L2dEb3hju34J0eqbXLCY6Hub/g81Jl4pGCA==", + "requires": { + "@types/lodash": "*" + } }, "@types/mocha": { "version": "8.2.3", @@ -7525,12 +7519,13 @@ "@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true }, "@types/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==" }, "@types/semver": { "version": "7.3.13", @@ -10334,9 +10329,9 @@ "dev": true }, "immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" }, "import-fresh": { "version": "3.3.0", @@ -10527,11 +10522,6 @@ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" - }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -10707,6 +10697,11 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", @@ -10956,14 +10951,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -11173,9 +11160,9 @@ } }, "protobufjs": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", - "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -11192,9 +11179,12 @@ }, "dependencies": { "@types/node": { - "version": "20.5.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", - "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "requires": { + "undici-types": "~5.26.4" + } } } }, @@ -11595,9 +11585,9 @@ } }, "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -11650,11 +11640,6 @@ "is-number": "^7.0.0" } }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -11750,10 +11735,15 @@ "which-boxed-primitive": "^1.0.2" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "uri-js": { "version": "4.4.1", @@ -11840,20 +11830,6 @@ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/vscode/quint-vscode/server/package.json b/vscode/quint-vscode/server/package.json index c7c1beaea..88b0865a0 100644 --- a/vscode/quint-vscode/server/package.json +++ b/vscode/quint-vscode/server/package.json @@ -1,7 +1,7 @@ { "name": "@informalsystems/quint-language-server", "description": "Language Server for the Quint specification language", - "version": "0.11.0", + "version": "0.14.3", "author": "Informal Systems", "contributors": [ { @@ -43,7 +43,7 @@ "test/**/*.ts" ], "dependencies": { - "@informalsystems/quint": "^0.16.0", + "@informalsystems/quint": "^0.19.4", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-uri": "^3.0.7" diff --git a/vscode/quint-vscode/server/src/complete.ts b/vscode/quint-vscode/server/src/complete.ts index 4d899eeeb..cbeb7c855 100644 --- a/vscode/quint-vscode/server/src/complete.ts +++ b/vscode/quint-vscode/server/src/complete.ts @@ -219,6 +219,7 @@ function getSuggestedBuiltinsForType(type: QuintType): { name: string }[] { case 'oper': // no suggestions from here on case 'var': case 'sum': + case 'app': return [] } }