From e006fdd7f35cc89ce9ecacf0aece1d51be197504 Mon Sep 17 00:00:00 2001 From: Mathieu Geukens Date: Sat, 6 Jan 2024 09:42:19 +0100 Subject: [PATCH 001/267] add bch-guru to showcase section --- website/docs/showcase.md | 8 ++++++++ website/static/img/bchguru.jpg | Bin 0 -> 25057 bytes 2 files changed, 8 insertions(+) create mode 100644 website/static/img/bchguru.jpg diff --git a/website/docs/showcase.md b/website/docs/showcase.md index 1c953d65..d336a911 100644 --- a/website/docs/showcase.md +++ b/website/docs/showcase.md @@ -36,6 +36,14 @@ Bitcats Heroes is the first collectibele NFT series on Bitcoin Cash. The project Cash-Ninjas is a collectibele NFT project on Bitcoin Cash which focuses on building open-source tooling! The Cash-Ninjas project uses CashScript for its non-custodial, multi-threaded minting contract. The contract is open source for others to inspect and use the contract code. The Cash-Ninjas minting page uses wallet connect to allow minting directly from the user's smart contract wallet. +## BCH Guru + +
+ +
+ +BCH Guru is a non-custodial price-prediction platform and a collectible NFT project. BCH Guru uses CashScript for its price-prediction smart contracts to have players commit to a secret price-prediction. The project was the first to pioneer integration with CashConnect, which allows wallets to recognize the smart contract template and understand contract details. + ## Unspent Phi
diff --git a/website/static/img/bchguru.jpg b/website/static/img/bchguru.jpg new file mode 100644 index 0000000000000000000000000000000000000000..92cd8fc9b75937d2c50ade5ec53a4eaaff1a512e GIT binary patch literal 25057 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 j`Vk)&&7 literal 0 HcmV?d00001 From dc566a7b379926e26df626435a5f6966d234f25c Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:20:00 +0100 Subject: [PATCH 002/267] Move the JestExtensions file into the src directory --- packages/cashscript/{ => src}/test/JestExtensions.ts | 2 +- packages/cashscript/test/LibauthTemplate.test.ts | 2 +- packages/cashscript/tsconfig.build.json | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) rename packages/cashscript/{ => src}/test/JestExtensions.ts (98%) diff --git a/packages/cashscript/test/JestExtensions.ts b/packages/cashscript/src/test/JestExtensions.ts similarity index 98% rename from packages/cashscript/test/JestExtensions.ts rename to packages/cashscript/src/test/JestExtensions.ts index 76e0185b..7d4de86a 100644 --- a/packages/cashscript/test/JestExtensions.ts +++ b/packages/cashscript/src/test/JestExtensions.ts @@ -1,7 +1,7 @@ import { MatcherContext } from '@jest/expect'; import { SyncExpectationResult } from 'expect'; import { printExpected, printReceived, matcherHint } from 'jest-matcher-utils'; -import { Transaction } from '../src/index.js'; +import { Transaction } from '../index.js'; export {}; diff --git a/packages/cashscript/test/LibauthTemplate.test.ts b/packages/cashscript/test/LibauthTemplate.test.ts index 9eb9cd8f..20d57139 100644 --- a/packages/cashscript/test/LibauthTemplate.test.ts +++ b/packages/cashscript/test/LibauthTemplate.test.ts @@ -3,7 +3,7 @@ import { Contract, MockNetworkProvider, SignatureTemplate } from '../src/index.j import { alicePriv, alicePub, bobPriv, bobPub, } from './fixture/vars.js'; -import './JestExtensions.js'; +import '../src/test/JestExtensions.js'; import { randomUtxo } from '../src/utils.js'; describe('Libauth template generation tests', () => { diff --git a/packages/cashscript/tsconfig.build.json b/packages/cashscript/tsconfig.build.json index 48a56f11..e4239e0e 100644 --- a/packages/cashscript/tsconfig.build.json +++ b/packages/cashscript/tsconfig.build.json @@ -7,7 +7,6 @@ "include": [ "src/**/*", - "test/JestExtensions.ts", ], "exclude": [ From a79bb34d39e535b40b81b14dd3414d5b7cd0fa3c Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:21:47 +0100 Subject: [PATCH 003/267] Bump version to 0.10.0-next.1 --- examples/package.json | 6 +++--- packages/cashc/package.json | 4 ++-- packages/cashc/src/index.ts | 2 +- packages/cashscript/package.json | 4 ++-- packages/utils/package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/package.json b/examples/package.json index e839702d..4c8e350a 100644 --- a/examples/package.json +++ b/examples/package.json @@ -1,7 +1,7 @@ { "name": "cashscript-examples", "private": true, - "version": "0.10.0-next.0", + "version": "0.10.0-next.1", "description": "Usage examples of the CashScript SDK", "main": "p2pkh.js", "type": "module", @@ -14,8 +14,8 @@ "@bitauth/libauth": "^2.0.0-alpha.8", "@types/node": "^12.7.8", "bip39": "^3.0.4", - "cashc": "^0.10.0-next.0", - "cashscript": "^0.10.0-next.0", + "cashc": "^0.10.0-next.1", + "cashscript": "^0.10.0-next.1", "eslint": "^8.56.0", "typescript": "^4.9.5" } diff --git a/packages/cashc/package.json b/packages/cashc/package.json index f6509938..17039dcd 100644 --- a/packages/cashc/package.json +++ b/packages/cashc/package.json @@ -1,6 +1,6 @@ { "name": "cashc", - "version": "0.10.0-next.0", + "version": "0.10.0-next.1", "description": "Compile Bitcoin Cash contracts to Bitcoin Cash Script or artifacts", "keywords": [ "bitcoin", @@ -50,7 +50,7 @@ }, "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", - "@cashscript/utils": "^0.10.0-next.0", + "@cashscript/utils": "^0.10.0-next.1", "antlr4ts": "^0.5.0-alpha.4", "commander": "^7.1.0", "semver": "^7.3.4" diff --git a/packages/cashc/src/index.ts b/packages/cashc/src/index.ts index 28b8f48e..eb8f7e76 100644 --- a/packages/cashc/src/index.ts +++ b/packages/cashc/src/index.ts @@ -2,4 +2,4 @@ export * from './Errors.js'; export * as utils from '@cashscript/utils'; export { compileFile, compileString } from './compiler.js'; -export const version = '0.10.0-next.0'; +export const version = '0.10.0-next.1'; diff --git a/packages/cashscript/package.json b/packages/cashscript/package.json index d17f0464..3a091e3d 100644 --- a/packages/cashscript/package.json +++ b/packages/cashscript/package.json @@ -1,6 +1,6 @@ { "name": "cashscript", - "version": "0.10.0-next.0", + "version": "0.10.0-next.1", "description": "Easily write and interact with Bitcoin Cash contracts", "keywords": [ "bitcoin cash", @@ -44,7 +44,7 @@ }, "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", - "@cashscript/utils": "^0.10.0-next.0", + "@cashscript/utils": "^0.10.0-next.1", "bip68": "^1.0.4", "bitcoin-rpc-promise-retry": "^1.3.0", "delay": "^5.0.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index 9eb99c0d..b0f49088 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@cashscript/utils", - "version": "0.10.0-next.0", + "version": "0.10.0-next.1", "description": "CashScript utilities and types", "keywords": [ "bitcoin cash", From 40c575741c526637ce43b20ec664ac8a0e84d606 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:27:27 +0100 Subject: [PATCH 004/267] Add DEVELOPMENT.md --- DEVELOPMENT.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 DEVELOPMENT.md diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000..007830f7 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,7 @@ +We use yarn workspaces + lerna for monorepo management. So to get started, clone this repository and run `yarn` in the root directory to install all dependencies for all packages. + +When updating code in one package, you can run `yarn build` in the root directory to build all packages so the changes get propagated to the other packages as well. + +### Publishing a release + +To publish a new release, we use `yarn update-version 'x.x.x'` in the root directory to bump the version before release, and then `yarn publish-all` in the root directory to publish the release. In case of a tagged release (such as `next`), we use `yarn publish-all --dist-tag ` to publish the release with the specified tag. From 1370c6b1b1489b96964b6df4a860709cd73a06cc Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:33:44 +0100 Subject: [PATCH 005/267] Fix tests --- packages/utils/test/bitauth-script.test.ts | 4 +- .../test/fixtures/bitauth-script.fixture.ts | 82 +++++++++---------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/packages/utils/test/bitauth-script.test.ts b/packages/utils/test/bitauth-script.test.ts index fda79864..4e74961d 100644 --- a/packages/utils/test/bitauth-script.test.ts +++ b/packages/utils/test/bitauth-script.test.ts @@ -16,8 +16,8 @@ describe('Libauth Script formatting', () => { }); it('should format script as debugging output for BitAuth IDE', () => { - expect(formatBitAuthScript(scriptBytecode, fixture.sourceMap, fixture.sourceCode)) - .toBe(fixture.expectedBitAuthScript); + const expectedBitAuthScript = fixture.expectedBitAuthScript.replace(/^\n+/, '').replace(/\n+$/, ''); + expect(formatBitAuthScript(scriptBytecode, fixture.sourceMap, fixture.sourceCode)).toBe(expectedBitAuthScript); }); }); }); diff --git a/packages/utils/test/fixtures/bitauth-script.fixture.ts b/packages/utils/test/fixtures/bitauth-script.fixture.ts index 63c760be..8bf67016 100644 --- a/packages/utils/test/fixtures/bitauth-script.fixture.ts +++ b/packages/utils/test/fixtures/bitauth-script.fixture.ts @@ -127,13 +127,13 @@ contract Mecenas(bytes20 recipient, bytes20 funder, int pledge/*, int period */) sourceMap: '9:4:28:5;;;;;13:27:13:28;:16::45;:49::84;:74::83;;:49::84;;;:16:::1;:8::86;15:23:15:27:0;16:37:16:58;:27::65;17:26:17:38;;:41::47;;:26:::1;:50::58:0;;:26:::1;21:12:21:23:0;;:27::33;;:36::44;;:27:::1;:12;:46:23:9:0;22:31:22:32;:20::39;:43::55;;:58::66;;:43:::1;:20;:12::68;23:15:27:9;24:31:24:32:0;:20::39;:43::49;;:20:::1;:12::51;25:31:25:32:0;:20::49;:63::84;:53::101;:20:::1;:12::103;26:31:26:32:0;:20::39;:43::54;;:20:::1;:12::56;23:15:27:9;9:4:28:5;;;;;;;;30::33::0;;;;;31:24:31:26;;:16::27:1;:31::37:0;;:16:::1;:8::39;32:25:32:26:0;;:28::30;;:16::31:1;30:4:33:5;;8:0:34:1', expectedLineToOpcodeMap: { 9: [Op.OP_3, Op.OP_PICK, new Uint8Array([]), Op.OP_NUMEQUAL, Op.OP_IF], - 13: [Op.OP_0, Op.OP_OUTPUTBYTECODE, hexToBin('76a914'), Op.OP_2, Op.OP_ROLL, Op.OP_CAT, hexToBin('88ac'), Op.OP_CAT, Op.OP_EQUAL, Op.OP_VERIFY], + 13: [new Uint8Array([]), Op.OP_OUTPUTBYTECODE, hexToBin('76a914'), Op.OP_2, Op.OP_ROLL, Op.OP_CAT, hexToBin('88ac'), Op.OP_CAT, Op.OP_EQUAL, Op.OP_VERIFY], 15: [hexToBin('e803')], 16: [Op.OP_INPUTINDEX, Op.OP_UTXOVALUE], - 17: [Op.OP_0, Op.OP_PICK, Op.OP_4, Op.OP_PICK, Op.OP_SUB, Op.OP_2, Op.OP_PICK, Op.OP_SUB], - 21: [Op.OP_0, Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_4, Op.OP_PICK, Op.OP_ADD, Op.OP_LESSTHANOREQUAL, Op.OP_IF], - 22: [Op.OP_0, Op.OP_OUTPUTVALUE, Op.OP_2, Op.OP_PICK, Op.OP_4, Op.OP_PICK, Op.OP_SUB, Op.OP_NUMEQUAL, Op.OP_VERIFY], - 24: [Op.OP_0, Op.OP_OUTPUTVALUE, Op.OP_5, Op.OP_PICK, Op.OP_NUMEQUAL, Op.OP_VERIFY], + 17: [new Uint8Array([]), Op.OP_PICK, Op.OP_4, Op.OP_PICK, Op.OP_SUB, Op.OP_2, Op.OP_PICK, Op.OP_SUB], + 21: [new Uint8Array([]), Op.OP_PICK, Op.OP_5, Op.OP_PICK, Op.OP_4, Op.OP_PICK, Op.OP_ADD, Op.OP_LESSTHANOREQUAL, Op.OP_IF], + 22: [new Uint8Array([]), Op.OP_OUTPUTVALUE, Op.OP_2, Op.OP_PICK, Op.OP_4, Op.OP_PICK, Op.OP_SUB, Op.OP_NUMEQUAL, Op.OP_VERIFY], + 24: [new Uint8Array([]), Op.OP_OUTPUTVALUE, Op.OP_5, Op.OP_PICK, Op.OP_NUMEQUAL, Op.OP_VERIFY], 25: [Op.OP_1, Op.OP_OUTPUTBYTECODE, Op.OP_INPUTINDEX, Op.OP_UTXOBYTECODE, Op.OP_EQUAL, Op.OP_VERIFY], 26: [Op.OP_1, Op.OP_OUTPUTVALUE, Op.OP_1, Op.OP_PICK, Op.OP_NUMEQUAL, Op.OP_VERIFY], 27: [Op.OP_ELSE, Op.OP_ENDIF], @@ -164,41 +164,41 @@ contract Mecenas(bytes20 recipient, bytes20 funder, int pledge/*, int period */) 34: 'OP_ENDIF', }, expectedBitAuthScript: ` - /* */ - /* pragma cashscript >=0.8.0; */ - /* */ - /* /* This is an unofficial CashScript port of Licho's Mecenas contract. It is */ - /* * not compatible with Licho's EC plugin, but rather meant as a demonstration */ - /* * of covenants in CashScript. */ - /* * The time checking has been removed so it can be tested without time requirements. */ - /* */ */ - OP_3 OP_PICK OP_0 OP_NUMEQUAL OP_IF /* contract Mecenas(bytes20 recipient, bytes20 funder, int pledge/*, int period */) { */ - /* function receive() { */ - /* // require(tx.age >= period); */ - /* */ - OP_0 OP_OUTPUTBYTECODE <0x76a914> OP_2 OP_ROLL OP_CAT <0x88ac> OP_CAT OP_EQUAL OP_VERIFY /* // Check that the first output sends to the recipient */ - /* require(tx.outputs[0].lockingBytecode == new LockingBytecodeP2PKH(recipient)); */ - <0xe803> /* */ - OP_INPUTINDEX OP_UTXOVALUE /* int minerFee = 1000; */ - OP_0 OP_PICK OP_4 OP_PICK OP_SUB OP_2 OP_PICK OP_SUB /* int currentValue = tx.inputs[this.activeInputIndex].value; */ - /* int changeValue = currentValue - pledge - minerFee; */ - /* */ - /* // If there is not enough left for *another* pledge after this one, we send the remainder to the recipient */ - OP_0 OP_PICK OP_5 OP_PICK OP_4 OP_PICK OP_ADD OP_LESSTHANOREQUAL OP_IF /* // Otherwise we send the remainder to the recipient and the change back to the contract */ - OP_0 OP_OUTPUTVALUE OP_2 OP_PICK OP_4 OP_PICK OP_SUB OP_NUMEQUAL OP_VERIFY /* if (changeValue <= pledge + minerFee) { */ - /* require(tx.outputs[0].value == currentValue - minerFee); */ - OP_0 OP_OUTPUTVALUE OP_5 OP_PICK OP_NUMEQUAL OP_VERIFY /* } else { */ - OP_1 OP_OUTPUTBYTECODE OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL OP_VERIFY /* require(tx.outputs[0].value == pledge); */ - OP_1 OP_OUTPUTVALUE OP_1 OP_PICK OP_NUMEQUAL OP_VERIFY /* require(tx.outputs[1].lockingBytecode == tx.inputs[this.activeInputIndex].lockingBytecode); */ - OP_ELSE OP_ENDIF /* require(tx.outputs[1].value == changeValue); */ - OP_1 OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_ELSE /* } */ - /* } */ - OP_3 OP_ROLL OP_1 OP_NUMEQUAL OP_VERIFY /* */ - OP_3 OP_PICK OP_HASH160 OP_2 OP_ROLL OP_EQUAL OP_VERIFY /* function reclaim(pubkey pk, sig s) { */ - OP_3 OP_ROLL OP_3 OP_ROLL OP_CHECKSIG /* require(hash160(pk) == funder); */ - OP_NIP OP_NIP /* require(checkSig(s, pk)); */ - OP_ENDIF /* } */ - /* } */ -`, + /* */ + /* pragma cashscript >=0.8.0; */ + /* */ + /* /* This is an unofficial CashScript port of Licho's Mecenas contract. It is */ + /* * not compatible with Licho's EC plugin, but rather meant as a demonstration */ + /* * of covenants in CashScript. */ + /* * The time checking has been removed so it can be tested without time requirements. */ + /* */ */ +OP_3 OP_PICK OP_0 OP_NUMEQUAL OP_IF /* contract Mecenas(bytes20 recipient, bytes20 funder, int pledge/*, int period */) { */ + /* function receive() { */ + /* // require(tx.age >= period); */ + /* */ +OP_0 OP_OUTPUTBYTECODE <0x76a914> OP_2 OP_ROLL OP_CAT <0x88ac> OP_CAT OP_EQUAL OP_VERIFY /* // Check that the first output sends to the recipient */ + /* require(tx.outputs[0].lockingBytecode == new LockingBytecodeP2PKH(recipient)); */ +<0xe803> /* */ +OP_INPUTINDEX OP_UTXOVALUE /* int minerFee = 1000; */ +OP_0 OP_PICK OP_4 OP_PICK OP_SUB OP_2 OP_PICK OP_SUB /* int currentValue = tx.inputs[this.activeInputIndex].value; */ + /* int changeValue = currentValue - pledge - minerFee; */ + /* */ + /* // If there is not enough left for *another* pledge after this one, we send the remainder to the recipient */ +OP_0 OP_PICK OP_5 OP_PICK OP_4 OP_PICK OP_ADD OP_LESSTHANOREQUAL OP_IF /* // Otherwise we send the remainder to the recipient and the change back to the contract */ +OP_0 OP_OUTPUTVALUE OP_2 OP_PICK OP_4 OP_PICK OP_SUB OP_NUMEQUAL OP_VERIFY /* if (changeValue <= pledge + minerFee) { */ + /* require(tx.outputs[0].value == currentValue - minerFee); */ +OP_0 OP_OUTPUTVALUE OP_5 OP_PICK OP_NUMEQUAL OP_VERIFY /* } else { */ +OP_1 OP_OUTPUTBYTECODE OP_INPUTINDEX OP_UTXOBYTECODE OP_EQUAL OP_VERIFY /* require(tx.outputs[0].value == pledge); */ +OP_1 OP_OUTPUTVALUE OP_1 OP_PICK OP_NUMEQUAL OP_VERIFY /* require(tx.outputs[1].lockingBytecode == tx.inputs[this.activeInputIndex].lockingBytecode); */ +OP_ELSE OP_ENDIF /* require(tx.outputs[1].value == changeValue); */ +OP_1 OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_NIP OP_ELSE /* } */ + /* } */ +OP_3 OP_ROLL OP_1 OP_NUMEQUAL OP_VERIFY /* */ +OP_3 OP_PICK OP_HASH160 OP_2 OP_ROLL OP_EQUAL OP_VERIFY /* function reclaim(pubkey pk, sig s) { */ +OP_3 OP_ROLL OP_3 OP_ROLL OP_CHECKSIG /* require(hash160(pk) == funder); */ +OP_NIP OP_NIP /* require(checkSig(s, pk)); */ +OP_ENDIF /* } */ + /* } */ +`.replace(/^\n+/, '').replace(/\n+$/, ''), }, ]; From 591f71f3c980f54be3b14ef578889d1c4f4d4d9e Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:50:14 +0100 Subject: [PATCH 006/267] Fix interfaces import --- .gitignore | 2 ++ packages/cashscript/src/LibauthTemplate.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f2b6e1e1..1945b137 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,5 @@ typings/ # DynamoDB Local files .dynamodb/ + +manual-test.ts diff --git a/packages/cashscript/src/LibauthTemplate.ts b/packages/cashscript/src/LibauthTemplate.ts index 4e16aa40..cfc2018e 100644 --- a/packages/cashscript/src/LibauthTemplate.ts +++ b/packages/cashscript/src/LibauthTemplate.ts @@ -30,7 +30,7 @@ import { LibauthOutput, Utxo, isUtxoP2PKH, -} from '../src/interfaces.js'; +} from './interfaces.js'; import { Argument, encodeArgument as csEncodeArgument } from './Argument.js'; import SignatureTemplate from './SignatureTemplate.js'; import { Transaction } from './Transaction.js'; From 61950f8f8d4e62d60ff1bf38c74591286791fe68 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:53:02 +0100 Subject: [PATCH 007/267] Bump version to 0.10.0-next.2 --- examples/package.json | 6 +++--- packages/cashc/package.json | 4 ++-- packages/cashc/src/index.ts | 2 +- packages/cashscript/package.json | 4 ++-- packages/utils/package.json | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/package.json b/examples/package.json index 4c8e350a..a6faa511 100644 --- a/examples/package.json +++ b/examples/package.json @@ -1,7 +1,7 @@ { "name": "cashscript-examples", "private": true, - "version": "0.10.0-next.1", + "version": "0.10.0-next.2", "description": "Usage examples of the CashScript SDK", "main": "p2pkh.js", "type": "module", @@ -14,8 +14,8 @@ "@bitauth/libauth": "^2.0.0-alpha.8", "@types/node": "^12.7.8", "bip39": "^3.0.4", - "cashc": "^0.10.0-next.1", - "cashscript": "^0.10.0-next.1", + "cashc": "^0.10.0-next.2", + "cashscript": "^0.10.0-next.2", "eslint": "^8.56.0", "typescript": "^4.9.5" } diff --git a/packages/cashc/package.json b/packages/cashc/package.json index 17039dcd..b0216a8c 100644 --- a/packages/cashc/package.json +++ b/packages/cashc/package.json @@ -1,6 +1,6 @@ { "name": "cashc", - "version": "0.10.0-next.1", + "version": "0.10.0-next.2", "description": "Compile Bitcoin Cash contracts to Bitcoin Cash Script or artifacts", "keywords": [ "bitcoin", @@ -50,7 +50,7 @@ }, "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", - "@cashscript/utils": "^0.10.0-next.1", + "@cashscript/utils": "^0.10.0-next.2", "antlr4ts": "^0.5.0-alpha.4", "commander": "^7.1.0", "semver": "^7.3.4" diff --git a/packages/cashc/src/index.ts b/packages/cashc/src/index.ts index eb8f7e76..4273a82c 100644 --- a/packages/cashc/src/index.ts +++ b/packages/cashc/src/index.ts @@ -2,4 +2,4 @@ export * from './Errors.js'; export * as utils from '@cashscript/utils'; export { compileFile, compileString } from './compiler.js'; -export const version = '0.10.0-next.1'; +export const version = '0.10.0-next.2'; diff --git a/packages/cashscript/package.json b/packages/cashscript/package.json index 3a091e3d..d85b4006 100644 --- a/packages/cashscript/package.json +++ b/packages/cashscript/package.json @@ -1,6 +1,6 @@ { "name": "cashscript", - "version": "0.10.0-next.1", + "version": "0.10.0-next.2", "description": "Easily write and interact with Bitcoin Cash contracts", "keywords": [ "bitcoin cash", @@ -44,7 +44,7 @@ }, "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", - "@cashscript/utils": "^0.10.0-next.1", + "@cashscript/utils": "^0.10.0-next.2", "bip68": "^1.0.4", "bitcoin-rpc-promise-retry": "^1.3.0", "delay": "^5.0.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index b0f49088..30e6c48c 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@cashscript/utils", - "version": "0.10.0-next.1", + "version": "0.10.0-next.2", "description": "CashScript utilities and types", "keywords": [ "bitcoin cash", From 23f2f6fc78f6a911dfe559404be7741aa824e791 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 10:55:11 +0100 Subject: [PATCH 008/267] Increase size of 'randomUtxo' for test purposes --- packages/cashscript/src/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cashscript/src/utils.ts b/packages/cashscript/src/utils.ts index a35f64b9..c9601ad3 100644 --- a/packages/cashscript/src/utils.ts +++ b/packages/cashscript/src/utils.ts @@ -343,7 +343,7 @@ export const randomUtxo = (defaults?: Partial): Utxo => ({ ...{ txid: binToHex(sha256(bigIntToVmNumber(randomInt()))), vout: Math.floor(Math.random() * 10), - satoshis: 20000n + randomInt(), + satoshis: 100_000n + randomInt(), }, ...defaults, }); @@ -351,7 +351,7 @@ export const randomUtxo = (defaults?: Partial): Utxo => ({ export const randomToken = (defaults?: Partial): TokenDetails => ({ ...{ category: binToHex(sha256(bigIntToVmNumber(randomInt()))), - amount: 10000n + randomInt(), + amount: 100_000n + randomInt(), }, ...defaults, }); From 08268ba871a154cb4ffb6b66577ee7a97dce034e Mon Sep 17 00:00:00 2001 From: mr-zwets <53938059+mr-zwets@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:04:43 +0100 Subject: [PATCH 009/267] add BCHouse to showcase section (#181) --- website/docs/showcase.md | 8 ++ website/static/img/bchouse.svg | 146 +++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+) create mode 100644 website/static/img/bchouse.svg diff --git a/website/docs/showcase.md b/website/docs/showcase.md index d336a911..bf55e6cd 100644 --- a/website/docs/showcase.md +++ b/website/docs/showcase.md @@ -44,6 +44,14 @@ Cash-Ninjas is a collectibele NFT project on Bitcoin Cash which focuses on build BCH Guru is a non-custodial price-prediction platform and a collectible NFT project. BCH Guru uses CashScript for its price-prediction smart contracts to have players commit to a secret price-prediction. The project was the first to pioneer integration with CashConnect, which allows wallets to recognize the smart contract template and understand contract details. +## BCHouse + + + +BCHouse is a brand new BCH social media site and the first CashTokens-based crowdfunding application on Bitcoin Cash. BCHouse uses CashScript for the crowdfunding smart contract to allow an unlimited number of contributions to a campaign and to enable any BCH wallet to pledge by using forwarding addresses. + ## Unspent Phi
diff --git a/website/static/img/bchouse.svg b/website/static/img/bchouse.svg new file mode 100644 index 00000000..82924e18 --- /dev/null +++ b/website/static/img/bchouse.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c39f140f8d6a5698738be198870840a838bc52fd Mon Sep 17 00:00:00 2001 From: mr-zwets <53938059+mr-zwets@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:05:35 +0100 Subject: [PATCH 010/267] add CashTokens-studio to showcase (#182) Co-authored-by: Rosco Kalis --- website/docs/showcase.md | 8 ++++++++ website/static/img/cashtokens-studio.png | Bin 0 -> 222469 bytes 2 files changed, 8 insertions(+) create mode 100644 website/static/img/cashtokens-studio.png diff --git a/website/docs/showcase.md b/website/docs/showcase.md index bf55e6cd..d375afe5 100644 --- a/website/docs/showcase.md +++ b/website/docs/showcase.md @@ -44,6 +44,14 @@ Cash-Ninjas is a collectibele NFT project on Bitcoin Cash which focuses on build BCH Guru is a non-custodial price-prediction platform and a collectible NFT project. BCH Guru uses CashScript for its price-prediction smart contracts to have players commit to a secret price-prediction. The project was the first to pioneer integration with CashConnect, which allows wallets to recognize the smart contract template and understand contract details. +## CashTokens Studio + +
+ +
+ +The CashTokens Studio is an application for creating CashTokens and for their managing metadata updates and reserved supply. The CashTokens Studio uses CashScript to lock the AuthUTXO in an AuthGuard contract to prevent accidentally spending the authority to be able to update the token's metadata or release reserved supply. + ## BCHouse
diff --git a/website/static/img/cashtokens-studio.png b/website/static/img/cashtokens-studio.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2f162d19bc75f6da02d2bfa4aa345584e843d9 GIT binary patch literal 222469 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 z z4#nzT`9HSaJD%$B{U1L@_R7fK2cbgtUKz(~n3X+Jw#WBv z_D*CZr0;d8&*%OA{CTmbR|4cx=i`Kxo4CT$DayBmX$!pP~tkv`Pr6 za`ku==u%^H-EH0DaqF4c1@%vL_G-G)6H=S_R0_RkABMhq>I6Ml#`x6F?pT6}b`fiW zPg*lYnx1SeXNDIb1?->bjtgBExh@5JUZ4}6shEWF5k&@s#;bX~c) zpz_zt%hl3qI}7Uco&5^-J5PbjCwcB=sdCZd;C4$B!ZY|){pyupUOm1}rO}tjKzoTM zs+BfkvqCwItL=G_C_TPNiVyinE#}#`idHMjv=HH~=0EB5S~UbDD2ydk+d6M^3|~dA zGk~+4j^%$|HB$5JHWAv*K#$Gb;yk*e+nZl*QCQ9wZ`3b@{G7@+tDL6! zaDX>Txh9(1b<{9o`xFy-SL8vb_9d!QOWz@sT6;vBqTQ5dy``&Nc|;h-m0%dL6Ecw{ zb~^Y(onP;bkoB-)>`_;Oqh11e?j?a!1&(I`xhSt-xkSDb9!P@e+dt$MqIIBTI1bF| z)XYBz^DAl@;qEH$nwZOdkW=LpZoopbg~xe`i^%?1&tg}qC-Uj|aAY8-Fnx2<&+U1n8OEW{kR6Ll9qKM+ znP1MPlNSQH!%6WZ1|2IYNF3B6?CtG)30|E$|d)N|i+<3NQlE@PCI37AwRHCS(;l)`^3|jWa z+`fN6RF)>IA(|o9g#(_ESI6yct!Gg>k*{~0NazsJ{AUK_yjXAsVTUk}TD5{1ueZ{c zNnQzG%(_A~$S5PlK=Isup!vmnD>D>FJWxao-|qJk9)~8ve@h7L@j*XH&k~( zzZ6i3W9sKe}(F~PGyUecsE3cPX3GLoM9#Y~dE zF+KC@@7Ux|h9%hXG~rv3nTZ6>NbW4W?8KP{iJo?%(-u%eLV>k?p3J_$T%jI`mZx7^(n3Yqd=C7`s4T0jXQUZVD$aVw->s*Al7)9qJ}SyRs=T zUGFZ>K$?O~VILN?HID7=ZbL_Xa$BBVlDgCHc_v#9@432e-X@V9);Y`e-l5malEVYc zR@u{Uy!)*&;3N+ol3J1l^w%I*=SW9=5NwPqG*~11oO?M>p2W1#fAPKx= zEaT(M>ry!$Dj2vX|8vax;)_>orHYwW_lK6wQCxwkdq&jk()GVW8=v9CicPNJZMtR; zK0n-Y=B1$M6p*>q7oc#`;`l?Fs>>V&CV_e(Rg~WL1N}>b2=nmWnKKzCA^LnD))nbx zZpp+m%bv(!+@jBCXO~|)b0+6fY?;wSd|-BY6n6RCX>x2!aHU_RKfuvdiRhNP>Ih9` z@Y9TFw}!AlI22bX$>2~(P-{{wd$)Kp%R37yOW9QYm&t!4SI9FQzp)he!_QEA7?TisP}9&H+{=si)JG4GfuVtEIbp))Hq5|_Xe2o zDsNhGnwGAPpi2J8kf;V?K0Z@khFLJJvmBE$%2M^Bozd@-a(-dtt@7g~jQaLdF??sc?x;OM5)vnw2)hWd`L}6Qxj9))|1jJVkPG$Fc*@bRWb-&9r9YS# zr_JW!yV_K~)146|pG6l1^rbsK=__?-Kj+#bPvc|-L@%ZTU~F=nOP zeakJn-%%bERaca6vMT%TkpH}hBRsu+6I!<|v>E_Dytw0{Tf?7OTo`!!)%?}b4D;dF zdN1xIc79T0o8(zdepD@W&V-Y*R7{OZf^l`V8uw9~5*GLU`B=ur*uWJ>nabPhTC2&^ zhFSH8vK^D+g4lBC+_iC=rZ>EIZV%dr+B_UPKErC1D5>}DU&0#%paZkE3;arXQZBh@ zR8H-z<=&yr9eme89ByodXFK}J^>K(Bmtm+1wu$`7MDvRHVo$%IGJsg=4l5i`85PXP zu^MLX#eU`tZIv^!-+HSBVb<=c<8&9WyB2r+l&HeY7;>``2-AY7jCHQ3rw7nk&_yAM zyVU&T#ZkUWEmaKs`$M0O^0onF{*e7e*X_FCzx3LWIMIPc~EWnf42_Wxi#aaG52ZEwv?weZ!4tKh2X3EcnW97j#&-j6Y-os;U6Tl8Zq1 zv?P|(6x!zoR1QShs8j9b@Rkca*7*oDA;u5PiH*p20)2rQQ+EbZ-ri4Ub~*XyZb>qb zJ=TdOx(dvx{McH(S0;vS{zSwWquCobrYbxp)UeV17ClNz=G3Q1USdjO28t6sGSGcb zbdIY~*P6)a1+a*0S%CGo@C^#y*e?5JoY{7J^$X<1j(D~nW7=sX6BO$S&gVA z4GSkas>3@YN9W;Nf;e)@_m{Rms6()|G^s>ozAkhOO4aq1Z#E@k6Kdfnqu|W3QVYu- z_~kX&z9sCJ7bjDMesliX`8xK?OVWERp?EhLfSVe7+>H11!+ziZsR5uf}^ z>)XSHGboe1cb)g2cSfhY599642Auaoc4cWGB&yqJ@>gh`C5z9hG1vo9Mz zpFl^9<;AHZnl7m#w5YHuiu9efnRd$eErMs5({u`17f>v7sDt*KdU6zea26IGnxfag zL}U+t{YVhPG1da0;QHpLuTByPz{>erpZ`bfO7+rvT+H3D9XN`oZMBiv$k^s0aFHW& z4;moeUaL~nv!aGKGG#0uITMU(Qq42RUf0HQ+wZ;r8fQNc?OT;76R70H@X9NSnGDSC z&rgZrc4OZ7;zc9#$2zn@rU8To$CWy82tIDQOWnJ}8}>;^F%hdCZsO;3SrgnGvzxJ= za0Z)rM^V)C8YRH5QO(yI$cspap1RUx;obg2)t{!LWW72y$Hp&LV>?2>p^Gc7sS(YR zdC&N``t40t=-Es>W83wW7)d<0R+x;Ut|*?sg%8L0Tx=#Q(#=uEdIA1@Jrz>#gi~iD zG^t6x@J8_vZ_dT4{?BedIojt=Ze|RY$9MnX zySTQQVD6RM&!0;kdB9*mdER3^kN7O~EGZXWF++t1ZR~Vm6g7$YSD-sPv7<1aBIfJ3^m#=3jQ-xgzotfNSuTI1HO$O{Wlie%&7_IxAifZ{w>u+7O z@UuW9aim%|>vNBjlU13e$|d`fP?wGOKn69I-$=i%!APALg}jG_b@dyLeI6hqgY!w9 zkvHC#vHa72?Kv>N zq$b>iC8-#LQ1kZf;PIC(v3{c1tL?=HsM_TtPj7gzRU>#gU2!CUjT=jxIT$ORfGV8! zSvIvlUp|2#HueI-a(1GzNDRW-i^2NenWFs?`>@BN1@kySB+Cx?d#gE~azpb{Y)%T4 zl7-DH6D}Qle4fH+WJ;EPvNH7#HkA-JdYT_3>oZS`-@G}3L7_mv{xZ11;Ygsv5^RF@ zh{+nL+IaV}_PTA037$JUM#kY=-K&v<#(sG+C6v2okA+4?XR%T2+CU!utcj#eA`%~^ z!oO1Sx!B3&g5jn)75)^kmo_h$UO8`}e*9tJBc^!%yw4jb}`fE%S7;|?2T`;wuDHssH|2-@r06^8+o?n6tYGCx;hqw_sQf%5bv))-zaW-;cLLiRgzQXPphE$lp zQb`YM(+2l_x-5mxCNBmQ=FLtL5bd}Ay046d_ij%D;P%}ud5^o)(Qp5;W{9IAo*rgP89?Q^Y|%}lcl?BzKSDz~Ja zI-8t&gzcCH6x!Fnq~Jy|d}#*pCDgpE3s|RXMdl1n*QNZbs#ww6I*A+ChlL0cv7cDo zaz2ATn5G$IJY7xd+;_vKZWNF!Eb zU$1lKo}WdhMBJ|y%%m|kOq&VYP~$*{Kd7Ksb@-C7_u$5=+~=^px*MyvWWxf#mET;x z+0h(-YSqzIEn&ebNW<|vV@hP9Lx=bdeTf`QtF{S-;pbP{Xf@gDhri2UBD z+ImDdBjZq0YQ$67Q^~q>w00dpE*P(eEIB(Kpdute!gQju^LxE(l-=dgxioP@ZXdSg zo-B3M<-Bv5U%22klbG=aHN0@armUR{UT?W`l@&GowA1_~A2~r859($!JK>+U=*-&z z2VowddTbcH@oK~%AsWyB(wDLO&P{&|BqXgZ{J$Hb7>QWgLFkSruXv~Z^h4ohDk!en zZzbDLuaFKmTl@s|vZa?@bmV0u-&j1~!;-;DX8hX=pLM2G6Tv?)8 zrwOzcS)rZf`KZ?2(WAy0m-M36Gp74ar2dPEbgg;M{#Dt(J*`hl562;XfMe1%N+cS{ zV^y_)^^Sw0qOZ>z9%mJ-Dy_p+Y@0y@XFTqlc{F_olpiXlCSvp_zDTcXcGSB} zEbR_z3xdXqN|UnjG9a}cwaeqYt93q<5 zZb~?8mTQj2`BslZsriF8zkq4q z-coyiBLU@-2r%tf!=(zDoFqS^U)78<|7rDRHUI@_FOMd*mODyI^$ahu@nA|a2krgd z92czE$*Zw!9ca;Vqg8mLnap&Z(HR^rF#F+asl=qKAv1{KqylcjQs21STba5jgmT<4 zRs8N5@N>>^@rU2h;-d$htCPdH%h~Y3(aXqynACAy9v?yt~YxHxLHrC;?7?9U7I(#g)Bt%rZ?2M-V1V|+jDK?&< z@u%upA;4+bV0cFHRz5w zwyOp%+C$`4yC#8#&S`#z7{ME7+T}+r9%O(o>%2FwM2BA~Ypito#mWi*l1bmRPoajH z-bp>r(*D0Dztcx8uJe&^g!+P4bvG4tWfv2O(I79Dcvvb+vh>g>7`V%;4AHc%Z)ifqaLI&ioDKWfQ z!Xl}#a0=8g?aF){a8@b7&%4w9wYin{uw#~@)0nelG%F)_p1JWNWtB|5}|5+O5?U&D8X?A5P>`IFFn8KDs-4QUwxp*2UE& zg`Ipd{%Y$SMiK8%NvT`a5oD zZr=cL)d@)GAC)(fGPa$FNU1-0ff~1kG_KKYPcbNj{ah37&{^D` zzTb$yK)2P(goVUR+0Sc%m}tgZ6dL!Ci9*t`&*eG+L2aALF!YoLPLwirC?1JsBfbEU zcwTFK3W%UzMI2#!5Qq&Ck{$NoiQsquK0sfnAR@yxf}>RM{%-P)0uPD^9d={i-OE|} z{$jDCb7xQH+1(En?|p0hM3=8+5ia2Z;o-io^U4}VV{kll!0Y-(tDm#(A3I8Zk$*mJ)$;StJ=2=n^j-{1Q9@lzb%a@~~T zfC6WIb2WiEQ+EuoGkkw*&-twaMan;|iQVQlL#375V9Hf&-h9~q#?)X9gbET341IBI5e7p<&sh{bupj`O(UVohPp@seFiA8w3A?>MIg?Y zqf557AWVk%=5{l)Ba@4$tHXofq{H*qUriK~v8Oibwu3IfEQi;q{Zv@*Fw!~$r`cNmk2IEzVLwleVaw;;Aj$D zH-T$yVO+#rBt%o*o5v>r;2-gO-dCX#@&n-UE%&`yj_y_*p~!Rhe5f3h9@kl3x=Pv& zr3gr8?#j5Ez_yd;Yv+Szgp(Lce`?HskP!2ojBEWy(Cd$fyhmq1$MkAbIEXS}W$~%v zb3k5pghN0oK(QKCeY{W*Rl9xReleXi^!0wVK{G+;op6u!h0<+)zZ9g^mOu@hN}Dpv zb;URus^+uj_cD=Iw);R%WY(nUw1T5ddK6~S@FoxO&#r5&Ek{cvoCDqk zTz_dbYCo@A1GhHsnwA`k-;jhT3JPE8Q;}lB^ODRyf^k}*oR>aBuW-oO+<@|WYRTuC zi}6Epj|S`5+*+D?Rm?Tc>IsuX^~?{gW*UlWbHe$D&A!g63CGi z!)v4Uec@_Tp5D*dt=C46`@bm1^W#Qr1kzGS$i&M@>9O!1R#uDnZ{3 zi8}fBmzUo#P$Z^4L=w>aKz%%hr!RMA+l7jSmo)ZUSV`AN3BTS<7Vn{x7Bj8Zm=IQb zFz5QRLPqG&MC&b0oCK0wBnk9;_2DWg6-qXv%WA&(!1%lMO$aD(k)MB>o5#UciQdGs z-UypUOu<(9(eoRF`7}Rw7*Ln@sD9dhOt3tq&pRV&@Ywa z`ibQ;Der*i%x5X&6Jw@TRv20^*Guo6ctnril~SQ{ScNrO4IQ#o1pN>K(5JJ7JUF?N zo{$WF{ITqk7PW*xg(Y@@=$Fl$P;@A~MPV|_%61<8;dA?|cqo@@W#|XoPkCTc^FIts>$wYIv7!JAqcUDc@D`~JIW%MO>BO`rfUxtNK zsa%qx+WtXFNHWO+Z`P3nS0~@}d&~&Fcp;LL=2&)Yer(%ldA<8gSeQ%l*fu%#41cLa zj+OX*g84ShMV~UwrCP+73&Mx8h zS-(-88Q8n4dGT9ykewbBoGe^f$T9D{lZNjH%@*?Txu1KucYeOAz6XxBo^!iwD5o9d z-UP0h>GFOmZ`Qd`3{50FNUPB4PF-5+2Hj^vlGs>aFNvy$msj0Dw$v9*6Uzz6AV|sC z^n-6lUQ#X=VW@+IVdj5|-zk{yFH}d~jJbW&-SVympJU2f0FS#ARC6*PDa;c%2XP1M z?I)80Xv|0X45d;^lrRm%{Lbn7NUL?ufr;^OA^AU4c#^vB80AG&e6bX0wN>O4TSr_L z66u*0i_ZeES$th8a*JSe^!hV)V{G(-qC&x; z(Ka>I8zR1+T0WnAEPP&8^6$EyBCWE)RCHjfPFyThpaF26izt&fZ$mU-JoXd-=n{>6 zzIa7^xDruLQBw7>3%a><4sE@r=K$zC)Bz|x@Dnl2seW{@Nb)wn_yAe#`od_`Eo z`q*Gj#|Go#ux;vHjwpQ03()5kh@2cxT%$e#Izr+CDw$J0=49BVxys%2d1J)<+euK_ zq(UAnR`?$lL#l}nzep(utXn9ov{lpGZIk9P-orbwt`1|@T9c6}vO{mUiC3;sSb`FS zO36r__uT0m$AFt)w;OGc|65vU2;xbR)6OTvbB!b5Dx zmR;|^LJBq$7Kh<%O>96oZHj(_oI2N0o}9-qCR+biliGnFvNxHaVUj$Jt-GeT>LC?t zB@n0q$g-i9pyraeFGJh_rP+%i^<4XFEJ9f+_LoNoFLLohY9H7BB)$Od^0yTXqD+u- z{StBB`@N2P5?z2EXSfHHa|-F5|K!Ssn2U6Zz=g_i?3V_NBMQNvI(deDnN0=nH@Mfp zgD1D;LnX-}_Z8@L0?+J6mt;Qir2Y;yZP>PIBdC%dU_ctRADQV`dJV@QdMrWkE2ND7 zz^P&;xkAJY#TVPM@6NnLk`89IAeHEx2Bn8p+0yRx{|L=)^MXtJ=2i^MLyJ|3+4o!? zc;ll>F4kPA(?36}^iJ)Kj2v~?5FY9m+gCr*w3D4hhb>u+uL*$cM>JR;5kGR8+SD0Ihs?qI-RFX=hL4*Hn)353vqw5Q$2vU3}<5B~Pf| zSP87+sTbDgtD)U|4PLC; zuNNvYoUqzEj_J2vzfyJIEF>lV(y(O)V2`#H%#GM@^J6ZYU%#&P-`A64kdxWz8;v6| zhA${kZ6-11{pnAjhPZVG$}HMCt$3mTQGScB;*}#L-Y)8*;vYL)x)0vXo0%oPkfLA* z@21=`P+Prq0r<4}LipJjDl8g&Va`fKWtN!kY#$d&N(@GH2>a@DaI1RN9o^F!^NB(! zLQPI0=8%78+v#!yQsM7?_a|nM;-ARM>jNg};^1B{M06{sO2{_UukZ7G`cdyE;(4mp znH*^iY|@W8tqy6+h(xzC(zU-g z!Pj%`W#Kc@7D2AG)chAI(Br#Zvjdj`27)Eon6#1)E40i$)%#~N;z8A2}EK+s~jKi}(3P?2r`)8YK+ z+L}#Er08{Ns2#SaO#g1`zI9XG@B02VXs?HmU&P|eIwRN44ER=II9Ht4xJQXGMcfx5 zQXCPEwy`k^xT4T>`Vei#a?=CKfh#b)+@ShX;)1RKks#qui06&er%;&FCWiVzjadRE zx2<=@;(JmUSoyK%;w*{wk!?g~-(II1l2_Hd|Bd9Im+)n{2%E4F2ElL}ItS4E+^4fl zRn2+!vJy;^i{D4%zyw|5IC2;)g)w@)(ZL7LGO^eeG-A-A)sT8bs-A^{Gn_xi$1xFMfA^RIW{lm9fn+H7pER1)A#km!>8eEos1v2cB^YbCJdaxA0Y%HC} zji?kzJMTp9fG*A|IdSG zJFqtn!_HthEKm=ml-Ibcw>2xD2o1@3W)INE+RIS+U(DP?!-%0e`=r2M<<3U0-9# zO)~5Y+Ye8GdC54lk{-%62PkwRe}n}D>Bh;k;37^_CGdCwb(^0&HAQ#-|{HTeM6^sr(8a7)8Ljrrw+B7Z-2Og zS2%~MO~>Aa3tN!p^T?-b_CUfWTwU<8;YuCm8cmR^mOFT_b0q|X)ld5`xn>;9?G;Ym z<%PrLOMb<-ABCYC$Wq=teU1S*8}#=;Dee~U@(!4Oj8*(qGnUD9*p(sKJ#mJqvjRh3 zD`;re8wsE+j@Bl}Gv(k66J|jT_Mhi#G8WDkn@7H@87Gl3)=Cl3X0|FDIP&hsybr{T zOtjtyn3x_Pv1i~{Ez9!FMN2rwXnXHK@V>?b^JT-G37Ia#xMD1ib934UCHh1fbZJU|+z<-ISV zLt#udTeY=TR|4gIMpE1ng_=ahbGK5UkBmX9QY+vX4vE1*zx6_QAP?Ic$HE09ZdV}F zmUUoj=#BdD#a8BIi2|Dl+ZLB3AyhHfGdk&E)<}ayHQ94azx5gu;u}{30BWio*NT`{ zN%cuErs@0dZt{hUsYe^RPgesL{ zr9y+AZ8LUu+4HZPl{D*JqK2GH%#o<#Csp`~VYSA_b*dfq>To+~q43Pqk}x1AV5ICV z1Np5lrxHA+PQ+%B-?d(&mK%@)9j549KKGGe>A)kRDqTebHc;yQW2iY&Ft z?nSJ8NYfXc>=u6)XM38MJ#N4gaZSv|`29OKtqAHlmG^v;XJ9 zzSX1<9|F<~lfa+@HrKW#JjL{Me{N9~Cf=H91GpTTUonS}SS!PuviT*F%V^m53m}2H zewatgSioOpqA+DsXk;}Mfh z0<7DapdsE$bI653LHY%r%3jqS$0{KMQ>hks9IW zlixb&$KPBHT>A<;P;Vcaw0?+XYvoTavI#K1x7Q27Nh&SAoAKV9Ds??RqQ=t;#&71V zXKO=T9r-@I9pykUkI%{3Xz2WJv13NmhpM`;N!MzJNp2oB$$>^e7EWjujWa}q3A&bk zjayyFF!WKs>O)jUX=|9y8Lqp2+rfj!hpiXt;x<}YVWFVQ5akaH3G)=1?_#6rF69;9 zE1H-t2Z6qC+rbE|lIQN_jGPwO&(mqWQYb>m&pVVW~6;=7&DLGl#LMnxT-k6KGT|l~ ztg9CXIsv*D2{0HGn^G=4t%{X=g41%%*$fyW`PSq5h1N+qqq{t^=#C@|s^ z0u-hV+n(PfZ&cc?zuD(cMCYXdlXX0n2p6(DCw1=CZjVkcnPM+)Xv=1Fa(9#pW_uvs zjNF_BrlQ=u9l)1^40!reha&<5DT#v>UEfhk;tKpqVrECS2AAjB8jMGq$kBt8xVC}%Ii`V9N%F4)TzLf!P=b*~Lz`^A#(w6zHiX*QFphA(d!RoDMh>OT zoo>0NdnmN9-8nO$_x5JW#I$DMCJZ>o_*CbM0|K&IKF!$CJ&WX=YT(y{$y{R6&B@x- zgXU&m;tX;bp?&-b1|qiZ%EEM=;jCmQ?AZACwc9UZ@TZyv6aKI9F4Qiu!Q|EQy6H0# zCn04>RHa%b$1Hq~y$U7OSw&4~QAImYheckNxj}s+A*Wap_*fKK+KPdgUm$=C^94+C5JW_R^!(Cazt&QK)Ijcmx)oa%>a z#p_{J1c*6^{@K_R(*v7g4lHZ2NY_)gXnlcF55(p*8>Ovl7S_TaHDp1^JAoW`W4_Lf!Y}O?zb*VG?+Ewk!4itxm(~bTv(DJO+lfZ z&{ef%G#3Yq@2w~8v8kwKUqrhFvr1-rirhZ`oFRpOeX_!M-~=N|#VmC8Z3`%UNL0JQ)G@zbiJuGSHya^3pv)#14!xw;u&d^SH@KPVg@q zo1zudf@GYfirgAzx?IJbxvr6yPk@4hb?nvS%80-`5=lN(oY>w|->?nJvs#UKVAg*i-z%_}6}2P#zLzn6zVG zsYs9tP`pnB^@Qet<(c7|ZpCLs(kXNMXb6$S&fR>C*djC<D7hy&;V<@z=GZ zjF8iK@_)~vzSL*bHpk>7YgnKgp}~0h6DMT=C&Y`Wls%x5JznDew72x}MH#mI@oZ6_ zOlDDSH@Bfb@ig3(T2B-kYIxvNXqQ6?7wBP%-b=El6Y~(i?bN|YUVIs=oKDd2itXU# z?WPG1V02;l6Uw$52@zMChZ;FA%>Y@0InjaSxdm!>-%}DA2-j*<*|6;9@oU=jOSy?Fkz=ANC@v0fcBS{h6jPQ_E)6IJs!f0VhQBt4mKjv6D7ggasjnWsEKBLN_ zG4$nM2JfKPiBs=>$W{<%zD*k@MBoB={w=&Kx>l!>!)k{Nn#cT&;117}!do5;>#&u| zBvAY7Mk-v|tXx?(GmB}|p~7t`fA%=7RJlx#C1f6ed^nFLPoOp#eFtt6x~4N-V_#D| zTlk1|EpHz_>OUW<=Wn`F4@uUS+q_p{p2hN6jsOU4Gh>ggFy71HK(F)Jn}+M-e*Kef zI%c#H`x1=FP^6z@u==wD@gqF!TTDI^Oj;iaHqcKW&{Dy6s?J{9!apWdUW78-Yq8vo zp@Jri(x%>Zk~z*C{vAcx`gfC`>cdT8KG-KD$HGc*Zf%-c8!n17*j!v>XU7^*7L0fg z8F0t-EE88*(pc+{OFyXumJcA;WS2fXV=DQ_lfXQ)*jYY!-^VHJBX(_(`V`iEA6z<@ zf9i*YIU9CWjPI*RLi?cxr=(EWAB9oGy-D9lX3*ya+`8|8K-joafE`&ISg~^uP5FrY z5eIq`Do~<0>e2s?0ZYJuuW^PQJ3){RmD7n8^1;ANWsQmzv!6Hhim|!#G|X?=nzTC3 zx3uTGw(!^+A8hbyVkCP_?z3m#xmqxk#@qt>X`a`SrOSjqM#~2^^ze@ziNPmKV%p1$IB*wH! zS*dW6kgCIkH>a))eft^8h1c{~88gTl#6FIUM_rew)TgBfY*a+T`SIY*#Zu9*u(g)~AM~kl!i!@X?_L6aVD^^nCrSl? zSz4IX@of5+$TlmCodY4^Ro}@+l=&R8X*l$V*P}nM$i@{0>{4YvXhx+9u%^leF54nD z!?EiX|F_<^ni%K@T!6y@9AMF&g~P&n#ug)0f;n7YGo*$_Tbp_#G%Cb@@oP@ip~J3IuD0%k z`a`XEbL17nemv63;-RrYbWqcwAIJ?_l}Ll*b6f(xry4R%!|WQlP724*IEWAY-YEq! z@)q}N|9ST>MaWleJ>B8hYf-|qst@3?h}6~tLHLm7FdUsp-v@rn!+}aH5(?+U zs19OCh{SN}^%IT)ci-;mpou)I1@#~1Vv&j`CKJD$!%|SMyaARi&v#C_5Ym{1jxir3 zG0r5b$Aih%n98ojhjIj0mB!3B&OmRrlK&jAxNKGvgG@;Cw5uQYLMP9Qwb6U1o$bWm z2=qmb`tam@a}V{tIh;dD3A?`swR5ts9Koi8X^`W`x1tQrU5WYcYya>HIa_Brf}+&x z$bUwE`7LkP*WzLAepjl7yN6Y&x`PR&a{abZA_icfUl|`CpJtRk1tWDk$9%eZh(#0c z3FUg8T$A}D&ybY*9zl8^xL*PLPf{~yjt#mOnaZ^MK!vJ8|J1*gUR8lKQook8#bI=4 z^FMFCyUf;&;VsoDBF%o7|IHrXRc8XQP9{xA-d|s@S3*Gfn6%}?XPF}prS|P`kWuW% z>VcZw)g*bQW*WBCkGfa~!1fZv1&>138DMZ#W!`u6(HNHLoz023KY`;skWu0Z;@>@7 zo*BODmU|EUEhKMvhgDbX#-Uz_$0S{>XYSJ1dK~=EQKf_h(Y}rV2HzFPhWtICT$NRz zz$~Dt@4+Z@U4)B1{ojbbaO~ryurA6UXZ6y|(J`fcxqqE9?|ovm4dNl~^+^0K?%UKr z{lEUh1Z>Jh>It41s~BSlx?)A~u6lN7sMn z4ZAm zBAiJ=qJ8Ipe|625gi`Ei0*bQ~1k?Tw$LY~|pCFGQvoV}pq*%Cz&F1ZOV{@EK+(j!; z#n#&1PC%OK(oKDAH!z3>>6BXFf&yyy@TK;~=PU*Bb^Y=S90#wr6Y@$P54f3vlA_Cm z62TVH^TG8_TX|W{W9I4!55WIlLH~q%G);XRLa4Y3W(bA5>IJkMo9B?LCvHG-6|%dC zyB=r{Pujrn|1pZmiyLbH9q{!aU$Qw7yfA%yV0$KhZyzq*3hm6L_vbso{xbx9bY8E6 zZ8?dJ*V!=K45`VHqJ_Oz7>t3<#B;*N{p$}$_Z8{yO3L2n@c3~Dzn6DbN+|LpkFMC$ zpF-rd+MGldOT)GMd3C2jh~=zQ%CFOmUKf&h`Uz{>)_=A=uW(3Y8TnY}L!KtKDEq2* zh7aD&x%PaM@~?ZHeg)pDnWpl{2LP$Q@@sC+`QhN_oAjx6?aRL`E9K5q%3|}U*xR6# z(AU4`B6QN{ZBcj(L1U!wU^7f=eWye)q3FslVY)4Cs$jzz%EtvXSA?-E!+ZeJ=r4S>@8O~tqxMob#)GWMG~Lw7J7!l>?3NJEwUh$=RZPOV6eU>?pIwB z5nl!rlE{K!{nG9tluYO?D!F6F#RKJ8n=eHRH$X-Lp!Ugbe64(Fi{^MpWLb@l*QQK} zUa>}p4eD}KB!=m-p7pi*aE?mh9Lq8r#$>-22ALH^@%V1_Q_c)}Ox$yS`HSo!gWKEr zqV?6BY+S5Iz_-ag(U&(|{2ZZ~w5IUnZMFN3BuYj5N6aOFOEXJ(5oO4VZmf|r{u!B5 z;T0jy_tb*&Psy5)Pz{A@U=#drKSKW|R7iDkU$G&;1B*?7^YZO5Vo(1|WlS03Gm}$a zhn63AlkxK89}X=`dTgC^YmNX_ADzo658C027ZcXCPNSrNGJCN4u55jaE*ArWSF-f< zs`8g7E&L8STVDbvQPYNf(DJidh{~PpkF`}%Qz|fd+Uj;{*iWs|QGkIud10mu#|!|a z+Z$6j@CH!5(M1^VO14)9J!6A01sJ|$4{|X5@(Sw5Ome2J+Ux5VvnPOk_?R9d@DO8C5LE1e@zTbR^0u8j@cL)JtSmTI6MPH z^YbRwDloT{QtpsX%tv5Xg%$Xqn=_$I1S=gXDtCOkddIWka(qEMf^`nO$;emihkW62 zKY>osFRAx8JrHm2N>X7D`@>V$&e<)STUq4u2s*kamN-o*phD)P(Vhm1li;py4JaI; zBwSk)3TD=!4zphn5_oGos9IuiN68x+KsAmp?IcmVFxnp`f81Ml|5)>jX+}!|B?S`G zTvOk30uzTk0pGmRU{)2$dZ_W>B(Rx@_QccHeo4(ww906yv7qCZJj}64IKKRX5zKjB2-D&Rn?xkYqCE%&ztN~0wPbtz2Aa>Lse5su`tM{s1uMTxPCuU!hU9u0at{_75(@2Iowac30ENc z6O$Zu;Wn{~B0;m*?lSPJN&8jnr$9%e!uy~di_qpGc1m|(Y+vRpr2$J?NhkcOE=!v< z!SA*C7E5dIPhe<(I^X!fat9p-ZIjC>aT#G(AM@Re7i2_E#a^D-_@*zUF(B)T`ICK{ zv2Zq-!63YI=hQ2Y?d-+HrNLw(sIfa0#gKuhpOh6J6^noa<0^(_cacBc|IWM906=iH zG~B;8zCc(H4Db#89Vx_fXFNwPWPNxs@MMcc1PKJXj>5>vHW*tDHCPl7lsm=+nxHqN zj(xnVWc2M_vsLA;1-FRKjuDwaw}ZBLeqh|0B`0JfrvyNYj~#JJFx|s~^1XYR@vv_7 zcd_q&+WJd1dTX6tB7%GUXQrkyyVg2ETu>mi==r`Y`i!tT@FS{JRQuCZsMf;&JQh{W zk{91lNB5x*xWbT6n+i)wTHeaEL9x)y%=NdFV4Ajhqw)vWQWZV4*3CskNcpr9VGhqV z85Kmj{ad;*R6R7okp_2iOOJ-{$Vq zhzb$LYk6`FZ_0%1ApG^>Es&*|(V)$cR>l`82M3LyvtZRN2U9{Aq6NK>RzL-w5dQ6Z z@C)AMG<|*Y5Xnzs%+|C1Ke$p5<=<>kxzy`p zGi8`Mr0nK1hINU_;1Uf6z6rG&4`yQQu8GdI7_ZejT4Vdj-;=`^u$X zEYzLOV!_^*QObYW>EPhq3(KL#L;63jc4c09?N~#}{QR-_%u>X+-M*Qi2>Qjebtp&p z^_Wq^Q3gINUCCQQG_)g*IuW-=935%e!m(|gcgbNNaEHsSkBpxMU?nusL88{B(W3&7 zFJ*r8CcW2)Z`G4~hGo;0oNfKA@qb%iipT-+H2&>B>-RJ?tqygJBaE0l-~52|^v+1= z%;`0}KC7WU_-$s%De}mv(&gJ!foT17e7jeT z?(TDV*i+N{DW?I;aHt@A6FIB=_-zU3FdAB(2v$!;Df)DNCPws9QIEtS%u{Ol4fK!0 zsWP_vSjvX@6D{im;q=u<@aISQAg4nAxvf74F`|)L=FlvBtKg@f7rx#lvut$yPwo(q zaPJSf2jTY7ME=B5j!r;mjeD#?CSyk%yjf%a;c?|E-uh`LT$Bo_j}K5>g~SIfFOG6T zCJ?Pf)d{3pdSURM6PFwCgI=vOeYW^bez1aG!M-H&$QHy}g;uLFHSF|%_HT&Qu*OmW zx&XT)joM9H>?{;prbb*gs zOt)Sr+49*J_?56ZsZkRD>N>$-WD-WC8)29<5 zFVfE8;5-!ZIz{r#<75ATl~hHDJ6SyjrV)zi{>Y#>*2qlj z`;=-?9D~-}@4GV3EdIO@u*m$NTk zeyb>hcTGLfD6&p_7mNZQQw3TJ@j-(>ESF|r_QXZEu@2`9zQ^)*ug_H!*EbhZw>YWl zHJnkfh?Ge=APn|K+^GUBSvdBKc~KZc@i`=s|IyQM(esmvvKBN{#&>aexVx|%3n-@| zp{si-T``lDhXM3>?qAwoSnKNt#%{n|;+*M}#IOVme46~tg5&f%_6H|D za0LG*((i(^pr18n?76U7gm_4IBU$72rM(-x5l3pTj9eN+3)G|vyLv9W98U&=T&&Xz zjZ%7EQw54i9)xsVE%<0z{o`R-_b~Zpd!Py)1F3|u2Hf6}RD8LvkMYa%O+pl!<37ucUpGXzCQ9MX} z*S0ZJ_)PzdvW-9KxnCd7`c_w8Qx1S)rl@`xg?ZiXx*DwbkX)(9C-jBq>eH_-5w~LU zanWJ@1O=IxcV~FmJ1nv9?Hq3#tSmp|Qn)wnZoy+KW~MJL5^rOu&sVm-PFVMl5Qk|Q z`~8C0v0qhZc6r_hT9E+H3+n(=`f@ZZ<2mqyCENbspflhjg482GFOf74Js4N}gYYa4 zV!@s7tvmBg>C%36YFDk^vy%e_13 zZXD<;Xy;kcVH>pc;0h@w*&Sl#=P8YeNwzhtm&DLvAw!Z-oW;gf7B+TsOP>y$p>9h? z67DwvLv&9|g?`TlQJKUbcZz~K%$#NFhZn+?P*~rO2ACeA9RSh{E%$_2^sf@U;(JOA zgN4ts?F>Rc&zh(IrI0G?1n#6G!9|X>&`8xcEt-yL0Ck)=I&tupf%u&7pMy{JH27}Q zVO+GQV%5#GJyy*Wfm&CjlXLG$vi;=eZc(?9k2bEjB_1^7a=-<7b~bqCU6TdMkay#2H-s^ zlUP{pJEcXshfydJP1+#X62~q;+gZC3Iz=!#ZXr!<0&hKv@=HE2zUEZFY7I=DO!?j5 zYtgYS{sC8NJdv1hUPvHoXzxnLDOElyLYxCuwh2elE(u=`=={78J;Zo{YP;+O%v8lr z5VP8l8#CJoD7gLOxd#@u#}2o8pqCS+&wH_JtU7tgva713ge^_}fEfh81tQ;%jva7) zvzcP$$(5oK-M-^j{XeqaJD%$I{~v!I``D4lR!1sXMU<5!L{Vn;sK^$fh!Y}PWRy)t zMn+cVF-oaOGLmsnk$LQ6e;-G$*Zckc{C@ws`Qv(?>$)D-W8BA)-YbXIk9s{&juEG^ zD}FU|qQ-ia6LJ3bni_M)b}HTfr$uxE)E(v_>?^ZTD4ABa?Q=J3Wx}mPoBYVCsdvP7 zR7fZ9-#auz6pZMTHva%X1JZu!!w7y{An`CwS8Wbae``B-RUK!F4AX_lR5m5SkgX1G z&?`XQT>sY%g;^;Psuarc+%ec8SCXLA-FD4nnFboLPj=5~F|4YkHIUnoopE%Qi1vgA zmX3*SOvyf6qa<;s$p8G#LS)LyruF>4Cy#v0lKwn%49C+3iI7os7JyWc(oae=Zow@! zT!2XzQ=~&*(49}NL^Q%q#vyj|CmcHS`%t~UVvARSs&zM)6-Qh8&t5t8;Q76ncWhcO zj~;Km!c27*?X~}$2=)++4`=l@`~_sk#Z1`M4S(E0l2&^xn~3M?}Ln&%)LeT@J}7t<1B%SPTu?a5S0~yaJe)pae|DOvszr)WWhNkf~cm{;Bn>Ki0I3{7g%sKdy;ZN?PIc>-I5{y$rjEa<~| zj>lkC`EU}ste`Iweij+F$X9~v!wx-t(j9`)A^Yw=b|dJEC@iPIh(QUe^ZL+fdtSsP zK!EimQg;v+^=-wpJr-N*lF0wf#VcJ-7sNP9NVf-`levNLs1tI*wM}MQgm7VamjWOl zfDu^|qkv2LYX&~A87*R4q(R`Xy||WeTHTP*A|)t07qfzohvQXz>_5k=+w{sk+~!+8 z%mvAipXtWaTma+FYYkhP^+Q#s2yc!)c{celMZpRA@}gELHD>i5vpQqDgz%kjZwfiX zf30zuHNS5%qwSM%F#5tq|$CY9rJ z?#GkjTdLI$-h!b}r()6p0`G?A=&;xO#w!-5g5xmi{T(8 zXk>XMR z=ufoWqGiyTFbf-jRP0mnVV`P!Dh?cnH`>FbY8k zZEqG}q#XnpZJQ!P->y^3gTcTI-{lK2+Jp;0jBxq^K;Nbz1|`I+tbrwWa7}se>P}&} z37F;3suQ_-OjBfEi?g;XHuBQ!{^`FyavNi-#&SfcvpO5&V`5Pfd~#1e1YlePB|^)( z6}1Nxf|XyOSpu8B(BL^+G5ObIqapOCrpn^w814L3zFiGV)M?#xcGTTv0b7-!<*5o?%whz-Hri*0W&&_)JO*6di;Y_xVAd; zVGwld?<$9H6|%APXPAH?ld(PN;`i^~%m1-$N*rX^hhS)0Mum~okdwgL`4<}kXRqhc z^1b^!SSNOFAYo&#rqcJMkECWX)by1coBw348-Lpc@m5>;BThPhpsyz5!1XM)&6MGZ z3<;~^);SpUdUySl!+?R1BI#FDVp&CqMRrxcJ5GF}c8NEK^g=VnscrGS2hoc}(Ng@G%Y##mk zGIlO$yzZ!$;_X^xlG}1S>kH21I+P+!U7HJQ80y3+Zn`RzZG~h>w}U9Di;;X^z4^m> zR&{{@%cD)tI)B#rby45t_UBE2l_&jd;h;tHERl`9Xhm!KoRIlwl@Akb#D%aob z)Ae9_a2gtgFV8_$iTem0hsR7>sPGa&u)FG3R( zI73^T*a@apNk%Z2|gbNPN6Oa1M168dOI4B%V>3UVp4JB(QBnSuFs zGIaAKkp_R*2sQ>$dp z;AXRy7{!#7SkPZdI~gW>uvr~Y{CI<6g@@xit0F%3Ewpe>-^rX%XE}R?Wry}$XNgv; z&hDnbwA>VL#a}B=5;ihSf8OoT3JAVklaiSfKa+966qIhU^wBd_rFg&u1;8qgc@YRz?F@!@M%ESZTqp4wYrN58u9Zra6Iu%<{L7x=_{jPow33~l!g!w|8 zCdBa@sxjgziX>f~Ty}FD5B+Gz7Bv&oO#kD)p*8Y4w;mp^ikHLNq>xT2v_OqqzHPwK zu(O1GIv^RyJKKMCB)x4OgKlY5BN3KHrypEwAAo+Dwv-G$8UUmf3mK+TG(_%CNhrzp zD`E2dN*v~hJQM!n|M#-X#pyZ4&i%X8ZpZaBit6$0Ao+e2J|U7m^zR|PBV`stptfl^ z2weX$g&-FT;i=Ibo??9Xrk}sG;)ZNpU6uY)qLBI|v-%{8Sjt}B?6P7m>~M6bsPBK) zIQ2lk`8lkyulLM8b4X>CeY|o89>`3P~tNY8R<*ICK?!X~vuAcJas5d`$6{P4oPH;2rh8{R(i*iZZ z`R{S1Gn>C3y9D$3bUPQ^-{acym^6fA*e#$Y+qM!a`{O^kZ*bnckp@g^4QRBOMhp2R zpbaT#*=pes=T(zGDB6{g`fYfHqAleegKS8XrK>ddHN$Be7Hk!&`eQnSH!?5EKVE|y zwVjr7;>FU3aWePoDm&^JIo^N7wDPS@ONL4D?DXfskIcQ9Z(j3MIo_jE{6XY6p0w7k zX3lcwcKQ_CcTW3K0opLLUC#ivzWI>lX+J)!k5bFj!$_W$&$l+@t#Xg?d9>(Sv@ahP z<9vVS$Wr*rEtbOJm7GO@_D0Sw9d6XLf|?>#J$8pN&ASx0zKW%7ra?(kbj_f=q|f{L zK@+?u1m;ozj3(OW}DaTOz!b*UFbUcJPWyDT!k z!X$%sg=~Up1Yg=+wv&Z7%R?~M#%_ldHkTE}m!izua?@%$g{TFy#g3!d_7~`>6AxkI zn!@OEFrQMcC!+9FmMzmxueYxVf^o@9QW$<7)oZHLLy>;X#$203Afx7HiRRYj;=8C9 zfDk0HYZs4$^PrLvrR95?EBiD=kYO?l9_(%ZugWq|rysdt1sxGp0SVpjwCPtu_g=O` zYV;SK?)?!_@va=!-W11vq(41h2+>)n5*j{bN?gYgImF9=Lt8YF$4vKc4WT*_iCbw) z3+WWQ9tjG~cNCQkAA#oK?(jONZ~Z-BLVA|`GydS%18wO$Cp0v{h6RnpI_X1%JHixG3}`HlUW~G zC4X@XDH}aXkMT^E{e$souVsF^W}b(Tu{k*S`4@5iUVeJMu#g&06-^C$_qwr{g9vkV_~s2=)Jn$@6uu`w1yzk5ji zyvU>MwMh-+mF^!;7C1@^D?BXKU1o>byjVWj`FEDi#QgEvgikn!JbIj)fU4WKQ~Z?{ zqk4>VpTyCzH{pgH`BBkQ{_k$&+pa4j+!W&N7H%U+jd?RmMPho~lC~{&h!#o)qC3N? z(U&uvYR%|-l!gk93ec&FlKy-arL(B&#s?b#SdlHawu@U0TLPsUKeW^_}Xp|cDla|vz z4(WZLv;=xAe;=(NKldzJzE}=-hp6KDXk5f9=Sy6ymA8$6jm>hY+ z?e37qw+?S^kHMI_#D{59*+H@Hb*G0Eqs*um{PDijUgM*F&C2?juyg@dI+9RO7k=#Q zP#ox5r%Pa{?^bM~kzdGfPWPtft+zKPs+{r+9SNE}=0+B1dHYNEfe5z*yVg&tR12wHdjKmF_7u`m>d7eV%Igi{25s zc=c1$rwD#Hk@pL8zC2 zuG)Xk*g0=oeoM>Yd223Gcp5gv05PW)7yJ63LlvMad&X~n$FUP{zpG@+R8{W}6N)Fq zW(4*?@%5Ok$Cxm0T0Ht>>a)zZo(zklfIyC&V^L<=VL2CjmM-$%SYseV7aNc4)cyIp zoy_~aC8$B7c05a9OyVGPdB+)=vDO`%gF@HKfiL1{rZ zZZ25}ZH(G7tf%C?W5brhh`*Et$!9_8x>DJyp4}vM2%KOwP zQ!l)3AjcQn;ZCE+B=CRB<>aQ{W!Uwf(>kbrO_$-{cY?~qB&*DdR9eum1Y9&WyRXsp zsz~~q0zICA$~5+S?L}f>=u!YuO}AsfbW8Q0i*YaIwR^j!&(A@D5Vr&1M4vK}ln;z?|tak0MW501m@u1r8D({V#RPussFHWp7neB@So}MRGVSL6rvle9g;_pNeV)QA$3lVy=sD@ za(aVfagrQQ-zW1+ccNX$dPFu$w=&E}Wx4bLvMviA?$4J}*+&Z~LOy1*oQ_HDYBs`; z8lOG!K1ENGd}li#hL9V{bJy`ARfvtat>z_T&1Z85HL-h{#+~J^BBkMlLP6?oMOThh z^@5Ju35 z|E>2DcPHcB)1VPtRB`p^^6&2|^hXwAGiiTpixADZ37?3M)EJeHDoe?5>`>zpo-%-P zC;+jcy3S(GYWYxH-Rq+W1e;m_OorN%l8admm$lS=J}3QLufMYFb4L-4W&(PqRxs+# z;(5*jN@~@Q=t6&oe)NVRY__b8T5|x>keh$~LD)z5ZK<~XCU5X|dN>q&`w}Yw%&U)r zqn%>?7*kkVV<(2)ZedgD;Rhic7d4oI4-lEb#ofp3XV|SRvX?z}!J8BrCwlPO#3MdZ z8SM67uKgX5lO%;ta@YKDAgy!r2x-DDvMaUKx$(SJ5}DuUl0e`?)p1VKfWWv{X-1Bt zE;Gxk(dMy}Pxj8Of~!Af>ll_Q?(>w+AOrFa%~dI#+vgDzcxg@Xh$aYF)|TXFghE17 zQ~@GyF?|#Z`}0eNc(GdiDPqF+54@|o>5{|`_Ve8IiYOO(?A&`LjsHZwLnH+UsaqRh zC)6(jd}W`H8qUWCXz^E3IXkUaaV> zfAt8qlQwzV2~FDF_T%vMSGg_61jg-UK1xhzsB*dZG9mePp}{3dBxa5fs?{@rCpIWR zGph%yqedkM3n&Pwkq)T4rEB_U*ItrF(N(RzbN3ry#lpr46Y-g%#3|oynR*M?@9WAJ zlN1bg=x~<=5659L@G9y)aDVTEmM#knQ`s6TAXkIm?-05%QqmX8t+VY+C9c)4ZQ5O0 zKi5Op`vueXe!=|ByFj6ED)J=#etq!!1$oRC+5J_0xIejI-~<3 zEJpwD86>IBdH1Zc0x8lM8hmjg^L+)4N?0vF;a2vbl}v@I9nbp}PcZKG34B^Vri__f z)>LF3Erqs&Qou{s|NM^rm=p7+A1Cv78z~uk%vGGB3w4tXWZ!>4{(4^P9lPPv6d8av zE&nal1DizJid_x<+>x{)liH@~frmgnpaU6Qh2 z+ak$s8dn*x-js=}8~$%^Y6M4|lb?IQxbq;;?xGke48~15X8A|c`1d{c02ilJoUHy} zq@Qm6iLdVfQ|UGI;4YJE=msENBh}O z{7=B|9DA$LEE85s)|q;h_toO|0{e7`W3kONl=ENO<8w<0Hps9j?o$$CGCVRDZn+!4 z;)BNNA$PtmIb0-kyf3+{jl3_(Lp{74(R+GWNsT^uaht)=)c9eK6q})r@xy`mtkCYR zGxw^kdP5G)Hl$b6LreFI+<_MTaRKY<&=)Vn&~GHQS3(^k%w|p@b6qlgBN&&*J7w11 zrm8*-eas2}*9Fv;eOWqpCdI)^Juad@S8M^Zks~+u zjj>1oBi^~=vr3e6ZRx5CqCuZ@|9aC{nU2wET{-EQc$4k*clt;p1ws9$5HkiX^`juy zjnhb-nML&~s2Rg|*T1khI26P^aAunWH%s*pdtO7UE5+ndv50ro1L}X==LnE#%dGZDfw|*iSy|Wc&`pbfFWNrfDKOwT zBbG`ptl&*~eoU|CEy%-Ni-1sD<@W6u+MYj#A0v_X0!-)a@^G9z_=m%8{?sqRxwLB9 zD6kY6C0De@6*4wa$&96v!)!=jAqeY83C6LLjv}7@}lv%xl%MCPZw+ zo~rMvcNb?HP2cpcnBa;)8mREOm$djnIjhpZabo6(Qet{aT(H4f&-g-(qgS01S8uP= z+sJ_JSJxQ5CL79XxcTI+@G2Qbr-XIqe!@K;a1459MO1()DO2l0bf6=lC%|ZL!;0tS zv!YKIY#SEMtFs)pC+WYXWWmUy+<}_oZn5pcbCD@%mct&=_V6PPR4#(pKKLvUYa&OV zU(au9A{@tN6XNI%)Ybq*a_rKcjAp7VqdZ3gK%1?rAR&wsVXFO}$4{d(N zhUFl^FMBtqe09yPQ`(mjPleFMrJjSh744|i) z5j}c}$fw^E4-Qr-qGj9c2Rd7x4-_p#+>Hrbyz>&q$xJ9+yW}Xrd}_YAezPj|`u~0r ztE~Ftv-Ybi5;JU$Lpio*F)ms47mt@*gwEypoVBd962L;sM!WcbfvvNEIooG~-$CN; zr)97jeezct6u!xk@(U0-v5XiATgQ*q{e&TUd>FFGApL6*;$d#3L!Q^^qV4*cr3g_Z zjf%kc>z@nt`_WJlwNmv%Wm6unTWcPLMMI$#cYhGvAFzSYa4Uy1`7ZxDZ!^HA#|k=k zg@a(4B;@q#P{IQ7AR0gW@v;smag zATq+G4bOBhe+ETH9I#Byb{Vm`c)yK8?NFwdoSIkn)I%2r-E660bj7Jmx;$+aq|NC{ zb(HQMMwv^&<{&#vxVN|G=X+9|<>>Kg96!xk`~RLi=^b`pN?ia5H~3UDdt|=Ow@R-WWhmOzoE0UDyyBp4);4nYhA*LbJi30;z?imMa_493RFMVPNeqSaE4j-Q& z#fpPS!!dC^$0^e^+vWe>rZHiss>uiS{`Hw68a|i*35EJEsivVFjx$1!L;H=OhMzNu zwEGg)Stx}ZASYI#K9X-qwYR*w5GmKg|3PV;aaLqCy4r-jtR510d7*39jqG=pd$&Ex zO`3w{H<21j$=OWUGj=Mw)S9^sdaQ@Yciiu$Ti=Tv1CpL^JmT%t*#545UJ_WyU%I;4 z_|7Dr^oiVVnHr!i^*xj868Zc__UxKjDvfO6`)n3p23fDtPNZ6A+-K_mqCvs|u)hg{n0J%<%Hx+C82RT+PS1PtZ40YTKrcTiw3ziQ`pM@lM$x3MSV*_~A z7&p|Im5%0i%S+vwrE)oj?LrC;gOZx+EE?&c(#kGMod-|~G8S?tC1)N9>$jq$9x8!;h0vP(B&L8kAEuZgyt zmRlXqb_5mJ>j?f0LoER(&; ze6Yc+#jLC5f$Kmp#ny|w0peq`ym!1)2;n-CfU*^rcWO4!uqqK_InR9dB`0@&=zL2f zIbO=N1#}A}|Hg($ppa)?4+PMdyK5)l#9e%h)pWGTT~sXm^8PeCljVIo4WQrsbsU^K zaBna)j%}20Z&HnY-fgk2Fz!0M%svD6UN5N-yl_5dm#H-yBXY&1O7r9{$+!&S>&V%= zJhwK1`S*4E85*kGAf;GcRVYC4f2S&X`AvOzH%3L793z;b1&>o?EWsrqaARXpTP7=v@q5r@`4Cn$P;!%tGVJ3?@-?%qq3>jP)&bV=p4ycg zF@Y->nxZ!7h`j&s=_Io=?`mb0#RKaKwZ;?AwZlX19qu_IycebDV}K8w;4XF4*`tdF zF=vyZ2c&LX_|AVy2O%HV%ZFB1s8&PA*52Oc`#VrAyvA@J@ukAwo!qp>fQ`Y!779x% z-2mkbN?aSNj`!T%!TfKiWCptTBsnt@>V!3A{3K z%`NF?8#2h|R~o<`FI{UZhZUpc_ANquPZX2ZTLApH;SRK!No?tZdTf1W_1;N__bq~{ zKsP`h@kQ@ae~3!tm4-h(vZk;c1NG2RWXpU#CD?NQ2#6Wn`MYMze5Kc1mq`$h@-v>( z66T?yE>u{p;8o+gh5<%A*MJZ^>G!?d)=*Nr!tZIpi1&|q^KNVwo@&r#kN=bKv=zpK zxo$6aS~eLGzMwL1ES1R2N8|{swd$^JPtQRH6ey3cx{_+$M8<*3vS6r&{2jN#S!ke5 zQzjnuxzaRQ4ezZyw*b&~G+Cp_WzaiKrmE4SAl4pw4GJeSwexxbw}6e29_CF2MJV13 zNeZm~)kt?B;WB#YxK+Sd+&LIPa4kw0X0B8 zbPPTJ?EGDOm>j>0cKytOm`DBmNZjh9#495;Y^#;t-VXz#19h2e9+E`p^kmu$>(uLm znbp>o3NYxDj_mu4^U_U1G*ZiLPnsJT__gpQn-5g=W<4YpKtATva0jW>(8;*$`3PvI zUeKXnSg?$lf%c1sBW}x%3mjUc8y#$SGLy{@+H@o4LR66xOht7(-F!gTy8bUmSRczXo z!c!wR?lVRyLZiz=*XoI#wr1%a>1cQ(S<9Zfgm7ry&bH}|iD&pFPZ>7hOOE3UESzp& z!hcOKYUfy0418yRf&u7l_ePteek!^+8^do{Y|fn1FQJQ@SsPz`3-gEldn%w%(uo8) zt*EV{j1^`Dm%%@WW)&K%KN;4^>zP05eRbtQ+8Ktigv^t7$<@vcFX8{UaC*qQLy5gx zGj_j2N168lz65k4)A~Tju=3V<<&Rml}KP zFDh2r8tj-54qd}H?>j^O!t7(Yq1r7w?LF+mHKy3IyT8o`<>ajln;K>eB@_2;Kfca& zB{~>w$Z^&K3UqPy@_g6ooTy|)m6eH^uhrVV3K8m(oE&a&uPVu@Av0c`U)>dd%+%Mb zpAPBLnP=C>1^{(>kRw)>48;1&+l-Apg;EDhv(4WoQsqQ&2d`V_S}cwF_B{Lh#4Yd* z&m#nt&#nuiNG@74Hw9^UR@MZHXhN(Yk2CSCdP@KP*f}fh4+0OlW~Ht@6lxq&UD%J+ zLcH{ws}~#yiQ{;oi^_qiDL*ZYJQ)<|@R|UD*4|fkR8{D}FsYq5EG1LO{w~o;Y@Ty} z>aAB5V;SZf28i1x& zmettf$RUx<#IOPRRuRNQFfqjD00FFLnH2}Mnwkm1q;!T>-9wUD2)3y zZ}YoKWuo^l4dOS}HLEW3hKS4`jsBi;ces4tEVu$lO1iFqYQ5!n?&A_-i4j3Q@ZH9orLub60C2o8~}g?mAn~+!OCU}D0vXuKO{VM08$poQN(u6fkg0k z^*vKuP5HzVt$h(Z*G3B#qj|AF1Nq!Ss7u zeIHR(RP^G&6?^yXyLDx+VD_9;{Bec(v}dKY z;u>^7reduPgP2hL#ovR{P|w3JYGXgU0CPi|XW<*VvlXf@`5j}9W&bP-*ul7`;#`>GCNj-vF)~GpL>6TvA zJL2#4<2@PjqnH*v87gs#uhSTI=|}F|`GR|7rWP zuwK;DhgkH;=H9TBt?|2UKBVAL^(F>^%vPiMi&^M`Tb33=WZdeEZ|jeO$mig_DRRj8 z#=gMWAybk+krebG_3A0L=7%HUxtWaY8f}oPx+K2u)-@&K*I`b{N}lG{eTUz!{{kM( z`w#EW=k^uJd0>9Y!>#L8_(MT3LqyuSrM*hcAMOTNgb=TK>&?y)M1M_O%rby24)T+* zOygpBGf$$>?!BUio^upZ6IhW(vM(6N!Dx2JTNVRBTegp3uTOw`>|v zj1Z4uWk*Lo3fm3BzHdf*`9lk`e_)UbFO4`+mT)&@5?GEB!=c}DL>MH{(j^WfKT)<( z1+@93T?Vr8k;jr6#FJaK-WcwOkz@on#Gv(lCG*Z!IxEf_seA11yTv?wUa)VLpmAv;v3cRikhhuZ!5!_L-Y z=N^UukqrN_HwsD|XI`nXoK4Z7F7|~%+oM0O$<#kTAL~G%KW>t7>O<8)fgMvT>+k=Z zX>|c~{S3d9;W(jOQUsc=4Hci|(5kxi&4H z3$YtJp6JQ&{0=ufJa_u={W1d|YpF!uFG7TN@K>t}gwWK9s#euDsCx<1mblU?#X5~D zGGgLmh2JTG1HtKbl$Ovyvhke9t@Re;elZP)qZ>D!lkd()5wdgna4oXtT+g|`v9ONL zgIh%Xb%#Dt;Z&Q#xgM$b!OqD)Aw25$qC8oG=3?uSS548LtH)oj1Rx#z&L#tC?Pi^2 zhb&y#CRxBMCYH#ei~5B*Edh1kA$I{E~&brqIs!V7VqbXH(gkhjth*Lb+mI<0sYv;va#=>09rXMsc(Jv?iu~Q zr`DG*Q!=`j-)73Hrkme=dgIUxsX%8c_K ziN&(*N?(gmYx!M^;pDLogn63yP_YVwp31j;zjaB^4GHmewixrN+`9Ovk2D~_b1q%j z7chkI2JXf+1dIP<3c3-_#S*Z3*p&jZ2Fb5;P6*TTjt)KEh}d`~IlE2wpM)^)EuD3X zKIA3;?kbJ(dAP};{;|JzSa3p*+&@ba8x^*6XKd(3JDC*7Ag4SvJ`XsjnAxGBf$%?B z?}B}XT7)AiK(0Kphh#uiT(9!PJkG-?J@@onk+SJW6j0{&^<|&B7@_(nQN91ZMbr~< z6H}dso(U-@I>hc>|1MMO!pJ+kVifKQKHGmxrbhK|yx64lH+0+w)fZL6&+e0FYXTD@)8ME zdmO*jB2gNVL{DW#v7Hb#&VNzda;5-{lSSMgCo-?Ux$2nbj6QN>sJxi5(dVYf@M_wK z<&>j&>sX@?SK9q8-a&))7|uJ|8k!WlgOmAoO=;aHp4m8X7Zna4>JxjQc#6~51RjCN z-(N2y3NJVN8t=J*xHgx$q=uAd@75%E6%*FnnnUQ(^L-%hFWR1LfgnSV> zK}|S-zzkRP=`Os~i||f?W*E2eTf@y@1<1H6e@~bO#EUEkH*28=X?Cq#(K7pXwjZ18 z+^J-q^BK=YI;K-L*;>I~{C3{FDzlS(33UNT?p=m^-19W+_ZQ#mDTf0wPYa*QHr^0D z8SScjET^;}|M^;G*_(Z@Rkij{BnZY{5?3g;aLE=1Tb^|TKhbR&A4*F#^T5iLB(?D= zCS?H0P}YBsC;5btKz3cnVqBiq)n^ihjzUVL8&XgjCsr z@G)eG+0OpOz9m%6}Lk;SeRG%=uu1Vo($GX*7aF^q; z(Hf&z;4baDDwqD~K%D1j0w$aXg+aF~CM>1=6( zzJw+mz#!rm53>^Xoo6f5_%utgAitb?#+`%GN{=bf=bMkr`0q})uOW$3LPqmhgt}V1 zWiTrsLr&c(IUoL&EmJq(owVhnu??ZnP9Xo3{W8mU3&r?clk}+oI|q?GS*^LDlDz3B z_=fwuIKPn4gV2f$b_Y#!J%12$eoE8rS1tOCU#>AvQyH?Oa`A*YYJvxMgQxgu^A{@w zY1Ah+xx+pc^<|Y;Z_2?;?g`W0nYPVvZ<@h7UNI`(tu zty9w@Es8BiXoS!CN0)esuA2D=n*+23r-^jmmo`)k@Wb`r>=`@vBOF@9H=*O3cqqp& z)2VXr1HjU?pz`K}_4`N_?R2jgDYh0$Uh&_YNq{m|>KRyW`)owZ#klC*y=Q0jmbv5D zaWGl=ji1$axC2iK96zD2Vs!7=GxIFMgQ^dy+g=r2!Sfw)y4o$Ite6Z(&V=a6d+Duk zy*=vJ0vJWBDu8<0j!J=gGrFTNTaO+MjEiu$UlWvo>fyk-BBEpjYQ&MBhE54S#qIbi z)%FWpDQqJdkpioOXp)h@xrf?+6<_Nu1ZD4|`hkE(3B9nawLc96oo;>v)?Y;mB-!6j z9D7gcVgPYdF1vpJpeG+yiJ30gQ0$lc6srQw*3;JGX3sA46YI!MJd<>s^f)?~4=KJ? z%Le3f&&NP{MexnCJ+kw%Qj1CfKEi9i&&_~uulbp9ssqCIweD}p)z9;+V@VZeksw-# zRPYGJ^DZ=%hLiXY4YlQ4Mv1U=AXd|6axD(H0aHo@#Up0U&N1$aDbS0tBw)J z*-9L;fj+AtH`ou%gnh_ad-3G7KG0sj1JZch(FX1e6$~kQKMNs5#b2eYpQ1$Smprrb z(D8tqVGX(Q1eoH2z~k{GdK_K;PAja?n12{@P}wbeGJL#6Cb`Km8Mgi|+S$peEh}wy!e0(ABchI!mJTo$KPs8v^w3WwD7RQ^ zD|qSmese~=vj6KHB_vInEdhhRON1#0kzM34y8dBbR)3ujz$Igpd-k7g{UML+Fyae` z{pM7|Gg3B#>z{QD^f~QUb5h9Oj(j&bRK_MkWgJ|qos2`*tyMB{Uf?w?AG z^2-}GfVsgBd!-35^MiI1bRMoe8In3F%bt7r*|XHx{X_@72$Q?N9x3SsmJ%O>$)U*r z1HK+PeXw1&s=3ia`FJ~OORd=lxJyI57k6>X)|EBSt0qor4MzM8*qS zi=asjJ8;3@CePXh!F@&!pbQ!D3d>I-KuxY?40jz2el*$TLF}-+5}rcNKRKOBe|Wqz z2n~?MJ9o2KH*G!O!M44<+zMI`#dJeLXoJTM!7gSSS3OyYZ_z=1makdSXpB z1c_-!x>G$De?J{W@RyrkZ;`I%K=!A${~VYiesox&*&)?|y?{`xTG4QcDu#gP+MQgjed5%*JU{S3NGWHTfs1-2UbuFYv2u7c6p(gGeQ_4 zYZ;4&wVtY2cG>Wq$L`)sa6A-S`MH1>1nvs&Zm>5%OTa_v(jm>E(T(xDKfZkL7U>py z>-J>dDqR%p!tar9Z>eBU|i8t+zgmeR#@op zkYHI7(EjMwzn^JJ-XGh^=utTiZAUoRB>QxkjQ1AsTuDZ2^pRB$Ul{(7q!YtrzV9l( zOu;-Q;o!?935bV(IaSXvqfcdTMNy0Q*8FmL5dkdSskWOl6O>}jyZ(b*NFlWnh6BRk zp_TG(1YbayzqOGz?8h!n`UHN`Crr)DG!RZxf~NjG4-tE^#=+~u&(qhw4n8gD;v zUw*s6>mbe>Kk^GB_QbfJ0IH}THzr(0!T1guHG*Yf03UMIA5F$z3H@M`*%Jp|YHi?? z9r4Cp7+YnVG9I<^mI;;2FPG()QD1he>gReQ$ZYMAT{6{TT;eZlfEAeF8Qsen+rzIY z2u{TOCN>WWPNh6b_}$eMZTNt=hPdJVSY8RZ3qH@i3$K?`=(l;xiOE?Uo}?u|b{Qy- z7r&G>Z0SKeokP_8D6|M0Dh&a7%1c3TePV127V|OB(mSqdvb=ig!(=&d!Eh^hTG*bu zE?8Wj4**-y8fz_$m6=U}3~)vuj8Ln^EXZJu9TWe1L_!avZO*)T%3ZP#_;TAE;VX3( zOjs>)8Acpm1p_xrKp-W*k{WZ9+o}?g`i&bhNRfVh1m1oNm`Fajny=sq@$ZHFUM+pP zfGQZbi^^lZrE>tQxc`J`Ql1FQ*ZDN_rroZ{Pd}YjtRN&@rY09IkPe$og(U2e=d}xI z|4fsf_@1dM*$>hkWTZQJURf5IKTgc|oP94W@(hiyYCh#9gyn);DR)x|WY<3N3#jMy zxx)d`qydlZuiW`LUlg1@QA9!PI^s)Vn(v!Wg${!ZMosR}&l$i-qtcFUeJF{g*9!;= zy?YTrk#Dr`k4ozW1ov&}GPG+lzk+z4b@RbJE-VvWc{yOvNZ^3-w>BHRz%%oEJg6Uw z*&lv5dm$C!EW-E5Z=$GY z+Sgy35&~i7KAjF2pXw0&A{MKNHb7toTn6^hKtj|%ue>Fj_Yjlu?^P7y2 zc`_H2d;a=MPRt3F)28Pz`$8A*vH^Qhh7ZRyY8m3Bp-$gEJkx6XoeW`mHjIaMq)eya zLymH3HAOl+3$a~Zop=$R&0J{26ka=c>|o1Iuu>Np6ho;L+BpjGr=B(*Iv#QZCYHDy zPP-(3I|DuErtDJ(9?!&+fLCch%tL;^h*mImB<@Xp42`Q8gzei)YjU_j^8y`Nz(KCl z{bg})Sow*5;bB^1Z=%N1B@IvrY7DfQc0&3p4SLJJ%kkxkil)lt^cpf;RLMV-`Jg>X zT9YzIQ*kl#Ay&5X($%n-NfW6M;C;33oasu!k5JAeE`i%KBs(DiLFQizsa$BW)1$j5 z@5I;%%Tx0lUv$e9D7b3zolJzpZ@KwV{_1Zo*tbw9;5KQmJoi3~-F);co)RAg$1c9y zAuq4TtrF|rDb0!0p>V87PF~dQn832xigY)tSF2s7G4le+Tv4&-i8J4+c9#mW+!o8r zD}e7A)uV55*O5|RFTuKHm~(k@Yd?4{bSp!u$R`~~`p)0Yjh@=~n|IW`Z+)@&g-8iE&IqyYX#>Hy?|Te4{msQ;&Y9b?fxwdtosLvt4U+)vIrzi=A$8P)ULfUG zRDdV7urW+RZkP%JdeB<$@|o0;*Q_uPc#v8m0S7jym6Moua{BZW(x=iQTPoXI><5ie zKHszdCo(_5$}*C@dJXnXL6@v_7%E%XZG5O3{J%&{um;|b=Etz00vcZcM{67LWl9rI z=1TwsyWO&XT|w@FRnZ!6tG`G{z#)HlyDl`!YWApk<}5W%8s%elcmE@Pw0V%9`B)1= z`>pNFzn`Y}1De{<@pl$BJ@iWWWc0(Ou!%9}AH8kkFR%*6dOEyZO8sEyo9hYP@?otY z1sJbKrp~o6+$CK?s@D660dDta#Y>Y7H$>=q^fSf&hN7IilM>bw|4pQ>dgDaIQ*0%9 zSl%mAGaD-vPEZ1p?Evm#6}J}ieJFoiIQ@OqUvuIPA?9QRMdVJVA#@dwh*1`j@g zv8`hmjVTz{J@Q0=9SI`*RyiKl;xfE2@)_D47sYce>TVz?I}yC zJLES39)OadtSzO+{Dkyj2gu+^cF8^*qQ)~KLh$Dv3yS2xax`>;qsjqNS&9bc9rqv7lgXAX-Kd9pYLH*ul{mD#{MiO+K-XH(%-O?u6Jc_#mw#F0)-{u8_*LLO=7pr zC|pkBAF%BR4V1kt*RXyIh4nk=6LX@S|Jf#s%mb5rR4%8nhb%oJ$XuKuWM+$S9bbJJ zS;mYRSKwg?{ItY*oF3~-zFBe zEtTX{k{Nt9lT*9RdwRB@Eq_V`TD}jVwkoNrSGlSP*3aP>2gC)9<;l5o+wArSN#fej z#QD=TsJg}n#-Ei|T$N(JJof>_Yw;ft_z@p?sL7*`<(MW=elpO zb9`JmCE0=Nx$ia>s);tdrnPdFHO44xfhD2veoR7?&FAQYW3c-1d2apPLLdK2N80rs(_d0?hp4Yi|&W3-<_0Q$6Cw8@+@9bcl zs2#eRCocA-ufw`uKwCE-x$)X*#i5c(1T2L9;!^tAJH`*ue14*+oRcr`i9Xv5s*zSm zde9Ny!x$V~A@E!btq?U_z_w5P9wqai%R&63;*chj&P$+kj+ymvegivR2(h;0Vq(Iv zF35wuz?-094`BfW$_kOCxx9V{GEGU8Kl_SJ1-0uA@rN9l^o?f3+^T72eW)AeVzM^= z$aP+nW$6gK9+CLu&%&UbV0a(TWW{MJlUjSAwa^KDDmc{O&-|&`en@*MOpl_itw zdGuwU30t-pO)CU1=`y*^^h?^RIR;%=`trrL!z!wL!wDKkTfHg;qHO9O0`@I3 zvJASbRAC>csnRC+MeJk3U5XhB{*A#a_t?`{G!~;XiWAnA= z2SD8vO}2}r;HW)|A6lJo8SnW3gyi8L!b0$^mRo z{c*03=P5bpckM*0ez@tm^7%sK#>j>nfAph22Hcqtc1uOy98X~s=Wyli(@Nm3%KrK8 zHZCoRsZNdx0-7@=asubB?_Z4@l-OyYs4Dby)@g{}Y@s9U->KaI@2W%?E2o~x8VBRb z^7?zV8nu1w(mc8L$U^TJC&MP7!+}5v)nicfkW83=9dAi}yx}545C*neOLDOxNS+2e zKgp$02umRu)vJw9l@)rg%!yXnH1d*{Q{!nGhf(Bq0-%sEZij-)czOwBapJYdT~=5wbhs>};q-0J)2@f+NKL)ARG zB4Arxj0kb8@+;*L05+WJjo^b%klxRB0qI2|oVyT42)nDY&v!-w1~{|fCrQY6{R4{Z z=DZFqCNYS_&D-FLQ~}>7`)lF_;Pw{wxNpk8W6bEa>n;aVOj0Hyj!yK&54y1Uh;Sjz z-&v!#o>8CI(AQTL%*rwmDHy$ey~)<|GDRSn8s3M6q6``*1CP1s497@9+gn0bq$H%| zrM$MsTvrcEs;763<^^P>oL+mDZIx7S2c|VEnK-k?UAl;pq|QY%Uy_!K5i1an+6iaA zrH>2u;H@Q-5hSkIi8EzU_BdMVt8Y6b;gL@pwcCf45{se74zmN1oFcYY66EpgPf;NNN=)gclr_so;0_94M+AD*$ zf9cm!rUM0uXWzfyAM8yVZ`5ow?y<`H7OIz=Y9k4!&sUmo?5*xzyUg_q(*(ZH6nCx* zAz~}1?!=^cv%MIr6nE`5vNtW@3Nik=;k{+h$O~@FA^*YR+TV{72W)E+VD(~ zXa>Vw4;K`MD|=i?)TZ-WU#Z=9?@zCpKJD-E%o424Sqbh6 z9hnZJ%#F;9QwRiZI`Z$SawTH)JMoVn#s@K>o)mG1dKQ?ScPY&_*YiKdxAH_=y~(_4 z?AY?zNUe9M_ zL#KtNHAct+hx;7?VkE#D4@Oqp^wwatTN~mkl^^>qXJLieUE1cL4}(8qP^QibydeS7 zAtAP>#m9n-`E<;_9wS05Td>OsTMrK3S$hQTDqcviK-!&N>au8zl!hm~jKTTFVFZ!G zd28ec>?t+}_j1yqY^**|2d2*mk%0bAgxma?ebxX3-HIR!s{A!VQ4s?t%Gi2eZDU+z zc!Ves&NKlk{Od_aZHYf| zU$=Fjr9~-WjI7=|783AQwLQQ3ZfpcaZGX4AwvJ>{Sa{7wgM+WX6g6*PQM!_tP3Knk z+AJWddhd_TS5pu-JBqd2&kw}b`mmjOq`(woQuDQ@ZbeYBLdIK&=xS?lZVYo8z4EIu zfj^v57n!Nuo<;RSyZ!X>TM$?yRNEpe8W&y4u{2GS;u_d!Xu8mkm!kH!VkA+Nnar)T zQdCr%Tm}zT68g@bSEHwFaTX{!`o)58z<<-%Hq*yB#%2~Mr~FEpPI=h7tVo$i`$cB_ z3#TBe&U3nlcJEn3i)dn)67q21qh9D1tw&};bYe1E5>D&7;0+$(Ios+wvg7IobBJ}Y z@7`#?L-XV&foT}g$M82r=G&anzo&Ben81rK#!@}G=21n|x&$7JsZd@{`sLdrW@6ru zuegQTXNow~#n|#iIh)s*Y5h^8jHTqe-u7d+cYOpDgf5j>KjR-!6%L}daHz}H@`wbmy_eOGllcD<$8 zY6E(t4z`YtiBAIA(5nLqfA`5E{eO)~muy)gGjTH)V*3rLgBhE6{8s+De7*!17|!z< z9(j`r`@G0&3Zks_wLd`K`F|d+{HsmV@cye?gSJo>zeXFP1e)-9F8;`F&Qq8EDzWYR zpO-m#{J2}s42LABsDxS~;?C`#W#Co6;L?w`?b$9iIbE)N(WT!*l3CjHm(?R}aBK># zUe-H-SWoseo-)doZ-5lvtIL|Z| zeaHP5xk1sLXsqO4#!zvG$Z%~H*^ga_FE-(%gd|rLRvKArop6axMIXm^J7#xpQ_}YM zb%*Go33nUgeEbuHLp+^|pqNn?JGc2?ot$W&I!-Diz#v&_*BTcOEa+V4JzIG8e_dvM5t)MDEoqS&)g7ABiUllAZ`0n)8~NvT>?u zAJw(T`Cl5b>U@81=~uXZMOZSdP*|e&rl!wZuoL>b$H74AE<7eB|(apP+&zO9%|Eb#4?X(!^L z;T!Gt10%qAhq%7O4zASna#ecP+o;)%Zy^-cjeqKLh2Jx_6uUSGYSsYQ(bx>-QgSVY zpmf@cLv>p*Owx-@4yZN7v)bnDaPyHPs+B|mI2&xg>v2BUA)J5rMWVH zf2JiRP|0%=5%eZ*ZC7ZjOFJoSdx8u9vCw2cnks>q=i1W4yJm$aE9McuOf3n=JT^z# z(W-5cc~X>i8oy9F0akvfFI9X+v{f^D%>A!DUu?h5eM$I+314ja5TlP((-t}5dcHaU z7R7DCVQ||Pe%Y9(cC!mjw%%Z#gp0wHWS`PdE_NBT^?H3AF?ccHvwH=FdS>ofq%RW)E;>B6g5}!%M;h3RvKY9y^jZHN z!dJ-ch|@e%c{CJX&+Fu|vp+#Nyk;hU{xpYlVj{P0|5KK&-Hv?ri(>oSAlxIbZDqs59NZfa;kco*(sGvSNs*60>6uTZk89a;5xSnvhY3mBI$V@h2y9?v z#3RV-$Vb`y@RN_#k(o1x1==c&q(t(2uIN-O(cD&+pesA{LzYCdX&SNX*DvQ#;Ozk5 zE#?;feEu)M8(SrO8K?G3EoeKn?G`>MUPmYQ@Z){0^gjdq`nZ@MR-~o_;Zn|mVXeDp zQvu?&R^)fU*!1(vo$hCxRVn9G>G#%(Ut9Poe`hfi-}{buW16xjL(mG_8XoNkB{LDX+suAMh8n-3(wP z((2kJ>N1p)Z4 zVMRTj6Ans@GoaPzz|eOinz-biZ_XDw=s<$OWcKjab#2h)kcIZ8SW4WOI_^TyIix2Q zq5=8cu<{3`I+L}Q=92%~gAL>is9Y~#%g)5hQxm&}XcG?WMt}boJD?Fd^>>GP@VX`6 z5vQaVcb;3ZOH(fii$uA6;-;IK!WAeN{sKm-wVXGJ=j66t$;K~-KG9KC9?V#8?&HD= zhO2{L$H@6y`t5DrOTt6cHD6ndkP`%e7t3gY7s-N7$#MG)41Ur8ki-=K477i{RW;lA&p~A<_~=t-rL{)<|Sg z=GGxV!oU4GpOTBE5#o2|!oYlp`~O~ zb+e>M%(N9DkR}ObQebcF;6owjBIl|MT2+8Qj?k!P)%b#kKUf? z*ZwbUKk-mt;IeSY|M6hX+^_u&B!dSqE*jUq&UQfW_x_oE!rS1rSoo)fC*3Y;^qRjl zLCyP0m0red#UIZ|^WsrKo8-2lv~5V)|9G*mEHp6;1k1=vMTU)G2zqQg=S^J7`sw~2k1KWuyA$}^#n)a$7@3_g^^Jud&} ztlvE7ddolvoBt=U*F@fMlGoAueFwH)Z7~*%cwM*q*7#Efb1k69R~m!1pYB9Ixtlq3 z^o;Xi-cCRSi5uZ6gBhVMkL{ThX}BR*+41L<7#=mqAU9#L;V87<>YCAGakLcT2#`yVkM)I`G%B@M)OarM)(t!Hi>9 z>(7Uea`D0@+>JllPEW*|Cew-)vq)bwx&h7`&+j5}Pt-9wMp5BNQ0tIIdeO2BQsetS zfqer*-+^d)68CVK(YB43DySHg0w1v2D%kYcsm_+R!8=@kYV=6B9Q+rT&f4wda%_Ga z<)h<+F6(JNK#!kE!a;b=K$h%Vjbcm+^LQ4EN^E`Rk{kv|-2BPovLcS46XC$iNpSES zJ{w;QEWNvw$S>gV;iJ=!yL6gEuRu*{8^Njl=i>^J@KBg!rkXpxP&exwsJtG52&yWZ z0rfE16l*8EfW8jgMcjXm*KYrqBU{zCRePbJ-`@n8`O2q39Mrshx2Qas6k*)Ar$-ds z?>(>e)pKbh%XQ}Fk_wcMM`Q(yr}dyz zC2~GpB|5d2DtvohL@}cz`9bc+GD#=aMUMI7#Xl>a0ZdSIA++Ry8aU|_;_W?%uw<^kNmK;rTEjUGFXvr|ymDePl(@eiZ{(|-Q& zC%?d*s{8ob&{$Yco)Xp68QtKx|1mELWtvZ=G`@=rEl_S<=p86%gQix^j`EKArOa2@i$H_A>$EI9!tKYvNVM?$mPG{CbF7)m%3aybi z#iu8IxUfwZ!tLf0m;&9kG~kR7(b#wUm^Bb1LAgJD1b$k3WnWN>`9cckpYOz6Bn+92 zA?p|S4lcNq-#W{v-NpQGUTK5uCzDGhDAHMS_RkYa@X=QSUCwAV#+6vr97Dt@6e->c zUhC)t$&b7fQKew*z!bn^vI8xn)P))=c>4BcjW_1ILk>9oFd1WBP-4RnZTxmpSFR-7 z0lW;W>@HJOLG_|CptUy&TKSZGx!u$0jTETgBNl@hh-xG_(}&#+1#R(JfX^+|NKO+p zkN#>cq*$i}L`xDMhOV!YNx=8#caZoBymwgk2$>1cdw{GYXwm4_2XTVzzii1aufiA- z7w!O6aD1udB>TAsSRT?WLQA*D*H|M#jMSK6QYU5m-~K&EECMDfI*TQIM#P~^jay<+ zaxn~KHD{zv2fejKHusGQ1uPw6W^*~>sIH~#gIDKK${N6jJtQCcGV4;TZTSzMmNqS# zqIZ*VLHt`lTo{{pV#lPYwwKmq0ap(s3;DHDs3W{;P!l|Mq#AJHfGT(4EKt`HD3Zc_ zfK;LKB%vjJ6XRD##&hwmt)oa$bKtlP-UiD?l`P78fuD*kvFCq1$e=&MU-=2j%OY+1 zq5c~=NXy?oGML_9iBV6re(_=Ur^b2iH!*_^fD83C1~XzWUZrX3Ru2I!e18C5opW3L zpYV`qf8oQ9oXH05q6O!zyT0T{17n60g;iQ(dk%qNn_T0bC1oFfu110Qm;xv~Iq56T zeM%^uT5;Ktf?1vR?X`Q2&|}&!G?%p$DY)wb+6G#a`u@wzquSaS#KhyO5)h?YuGkC4 zfD3uV54GN^mWBnI!&q`5AWhSlgVd}(v+!K?63EAgZ+~20w;k1?*T?ygN}NWF4vk>O z!&tQ7(wsOi-NgM=2meHfB@DAI~H@d zjncmj!gz#i1eQXXe0Bt)UTR&w*)TuHN9se>HePG1G>A<#oQaXj{;r!O=bM~KN%e3Z z1k3?4Oc(*G#Yru2&~H`g10vh^u>ya#O$IYi;3@@07Nw{FfMU&lGPC)uCFBf@P%W1` z-sCE|qyT3WcGv#V=%$4=feAqL;$>VM0Ko|TOE4VXT<}IRUa~YXjBV5{l5xHun6Hra zK3_L$wq0Ur`)Tk$9f2OShQ^MT-=#kym?B6r?D{j#ID`_3Rs{5MQ`zM!^*x~lZ3BI3 zJP%D{%8Orpiz$gGk1-q(yg7yg7Xwxb-NPjUq+s zU#2k{M65LUE%$^n-mLYO^xD;WyS48@5EYKHiZN}S%A(}&N(cB;2Ca%+%8VDP?n0V( z`M@Ay;}BKYCPT2yC?P^^?ka*L@{r8tzDxPfb}d))g1Ry&4S(=_oe`kItj#FjS)np2_Gnp63fH;UOr zt_km23XzW44Aq*9oN)@J7x7F`rN8pcg+Kt|?2jlCeQ^Im?xqlb*K3lcplS%!*C_Vm zloLGgzBNejI^-D7{2u!L#%g_mvMT+jn(Z(>%#V0E9 ze{~&GvnNfSAiEeOyK9HM_*H1hRE%37s|gBoOmc3_s^SJW~>gJw(y> zv4lr^0LF=p{-@NQ$&mV}i+5s=R23gXxJ^5b(_&l68p(sncNx&LAgi3IwO1oqx47~8 ziBP))yisf{fP0CJcD!BQ$$WYQ5x4_NM2Z|F zQgqGLY2OdMfHjFxl&sIVKV%MFozPZzy4hT2NTvj{WN2~+i0r$W^e-ZpIy{-uu50=~ zY37%_zbmCf&+xXd5q-f2}pF z+1snCDg@6+j|PQ+M$26lgtdvrbR=7{46GE8cd9w?rSBNex#p!7rSgpa)8YV$DjBw=I@#u%Y5j9uIq*I)HVZagG!Z9 zc~A+SUB|BbU+9ybLe%2%TSI{g7UZLIHqiLo&o*95GT^9KlBF{<=Yxl~v$HF{3oPd$dX_koJh zoBHoEEsa38YM58hHp^uU_(+ZLJ~XeV780^X%7-Tw9^wTwUbNe=$6Q}>ok(o`j}L#+w*epay<~FZ z`=y500k}+H4Ho=vQxlGN#p19Z!`)9k`lp??NzFYeD6Y+lmm&{i+RgBW+ngS=V_)N`o`c>{*X58J6S?nNO0S_6e zXHjm{yycba`?0M*m{FV-!Z14ZrA2En<7=ECQ2MDfffLpDbidttkGY7p2U(^=MLf6F zS(IvuZbf-7O*EtuFyG8wWNiPMAAK((h;^5>oF0+>sbfy{+Kb|C_q=tw1Ky?VMEm~e zP}$NotG&3S`(R{o1N7qGFB>Cg(B8mECZdjJz@wK1ZSC(5d%-~mXZ>tJIOzV8D^Lcq zsyAuS$ES}gHQ$ydoHi7$Do{?iwtg;G2N@q=1VTtR33UHu4!J2|3y^hsxfL%g7pTJ3 znF9n5Z!S|B#1eZhAF^Lh3cJ7RdeT$3C5D+m#UW91^#aerE|regCIz1-3fKl98bf&@ zp61^b7E^JOa0~ALl_$c%pN4(Qn&9+PIG{k$Gb}0q@;R88EYZy35)8jxm>;K^Nh)(| zRp}c%#xCR_?f#Oiw7Hf}`^ISef4n)UCONgy^0(QBa*Bn>Z^~Gg15W)lIQ0+hVh*#I zAC|hB5$WVte>iXhx$F($E=d5$(`j!d+kZ)PA;iD@WVA2yZNzihanAuy!A$&F`{*GY z{o&VCZeQZrK1ujBW|F#R@4y6mXeGH^jlbkWVoPpi100z-Gzf2Y9OHablh5cgdz?xP zXjiR4+cWfTgLtF?eA~ArAn1Tkhcz|zlL{mBXJ%>k`8^T|85s=R)xp0~Op8OlF&xd^ z3>iy7V)Vcor3{;LpJ-B8=1Ny3vskP|CAjGc^C1iNlzf_fd!nUhlMQwZVTg9# zI!2;5ft{{j7Hj}OpS=d%Va1Tl39EAuw+d>YQw$->hBz{MIs1>7BEJUQQ z395qAp9Lg8Eo#9KR2#=)K4`0d&9m5MPKS2PH-htWvLqh$tUzyM%X%-P`QM)3#iMtgmISwA+bZp`no%VkH7;yYG!OKytYdwBqKQQ4f>eI7o?RM7xodwKvkm$*ni+Ig;1Fbvdpz}SWur2iF z0dG>;kx?G%BB+EvpG=rQ1ybbTMApaJpaRw-8Wt>|Y_S_3f0A-L`#0#I`2hSq;((86 zPUymZ`xAh#1(;3n-X4?@`C-87I~E_C44r^XL(=Xy%uoj?3C2piodiGf*Qj(UU7l~{ zLbH)}01f#NB>~JhN+g<@LN2@2x2y25Su19t5mbJ9Q?LHhgA?yC1w;JQE_VRwIoq2L zI@LTo`q8ziS`qH}uah5=oDAYG%fg2ZZNvw_+a?*GL#cJUO>`H*0he6eA7zeHu}hewDsH#N0l$8vS_}iIr=?=#k4nt1rV(;W454%Vzj= zg+LcxP?o&d2o{WNb@L@tk5#lLG7U@8I52&x7KkU+B>}DVN9Tys_+dO7R?#<8Ozi3E zgl>9&%j#wyq?N4Z`JyxNGWu@FddxA$AyX$}GuHPmQ-dH7JdcF_q>yx?Wbz>1#8aDp z)>f~w(o4%_sE6*b`S9QP%UTUm0;ds4@8@?ZUx`0tH6=KNvr0P`F3e%OL+{mhq!cJ; z3mOjE)_i{Mm?@#%Zh^fP8VJ+-z6^7MhJbN#&vvk2cfFf0R2}A}F>UkiiV2RC{G(3V zB+y3RmX@nL6%H}@7x<>mC@My>{hb}LziKsF=l%~WoLApl zCG=jQ@Ut)1s;_--^Kg)WjUO4=oh>W<=>85k*Toz-w;bWpKR$k7MGzDaJtOVhydaJ| z+_tmG`wfN$&VbDlOWtAM-2w=HKyb*34x_bNCIiE$!b9*9)taOcEweQTF72}z8dDHs zk1cHpvz>@9Q|)f64dHQ=Q}NZ#g!3w^GAEFLTGGCuuTu9Ju%cTT1I~>uv4SOq1^gZ99aAr0V)JJCTZvUm46__;z?jJ zyJp`sT~I;cf7ln;3#la8Ymax;nD%1BS<_CAgX#L{a;`{-oFerb<-O6RGv~|*PC@2r z7LxEAV{=Y|S0!U5puuD-RGa-oOqSZ?ah+2WwW+~$g){ZOVFKSRu-^ftO~$YPe*jM2 zM~~!I=D|!Lb2y8d=Cemxxs+6cv_aXM2QlnV^*eXYBMK3KAyzf`3R={MfY>UR%BT;O-h|Lft8 zi@a+M4~NMKni<{dm4Nct8{HM8O7tn{g=;GwfdzAHhlY zZUJ7!57d#K{1~e2g0}hn3oa5C4zKQ#49@}CV+kLKm420Tcmq2D$k=n+M{t$yt5azD z^*@rfCIee`(%VncaJ1)RCE_q4@$F<_*N4mrCKXx>J+6_TdPhM*v^!u8C7!z1gT&|h z36Qe2b*n##6aOEe*|*-?Q2NliL~Q%)My7Fc_rJhLYyV96(0-NShjkc&<0YL+SE(xf z`1ISH0Lr?zOC-~47I5aH@B_|7^Ilu#f7&j`Vv+Xj>r9{UV0&)gf$#z!`${$V3}FD& z6MevZi-7vL`NuAQdIznq`Zsz>py!cb?_HtJ2qISCy^vNp;vR!s``r+?kOOoqb zqy?dWS!Q#9&bSc$3m6`k{{Ij{gktW1gdKZl*0mEs>K}SZ z{ljx00u8;^sRk%{d5w3bNS7j5ryZe>Gxka;Xmfk57Q{^5fjEGdv!OjzzbZj?O`P;r zM|;!EQ#Q1c61m-W$edmcXj8>1DvDpay7|BdDC2FpioP?C!A@dmneqTx6WuP9Sk+}W zs&Znt?taa;X)R6qHLj(i17@@~fXp|5b3Yz{vcn%hIs8}8Ur?I#UV3|orF~=;1wbwY z`U+>orG#4d`GgO%O_zMRRAV#~Kw%UBGPi2TlOJiud!Q6LI^g)3pa4~(L?)(6h-sdZ zHa#-kFgH_+f&oGQ_#Ec;&x5B~t*4g)+e+5~SKkj7JX48t*TKBl6}Jr}Y~acGevZvI z3WNNu#-|ZWi^A*wjvucYJ+!(KNJEsejrp59GBH#301)^Zc`&8q06D!p`uvd*a2Kmt;D(5auB9e zkXmRyWbT4Bri{X8wbd2nX=bQ}%q(jHtqE!6!=f;2d0^~}Mpv8pUlP={_yLJyd;rwb z>BU;v>op`P`Ir1jE{`R-yvexRgM5vn7__18eW^KHZGKnKMY*fVBu$n@n!R1+9x%NI zFboy8HkMQCQX$u_6~KHTcmUBiR-X|CZ8hw2l{}HxG?ofpOTtAxlfj_CZNh!4d2l#K z&uLezyy#~zyDU&kQZE65 zdb758B`B?513s^!uDd*XU~uOv=%DYplT3dFRw5dIhVcS=sa%LiY4ejIGSG5ifSSB7 z1eV`Wo~{O9G3Ahw_~2$hh}Gy7raG`@v)uyt#ZMqX67EsXkGDZhm(}p2&%u?T#!nP# z?=n5E_KS05nxcB6wP)IM7TfoVbHQWJ4$Tg#lI(0?xzkHUpI!P_WmS4)>%i|_6Z`At zf2v*={x{w^isT|UQHuO&P2I_yuk%2E-3$6_CHIAKKMhu3eW3)&dQ!ETbrs3EixU!Q zC$;}vON|erF1oeXT?E7QaJt!g$+HyZyf+;I*S(rjZ53=6z7(-Z%PL#DH~N)YyB%6W z8BD{is=|h5UTVB(@Y^XUQq`D`F%Xw)b?M!K($;J|O2~s&W4?rMb z0z=MYrZbL%9mh0v;p0_9$$NVWC)QfP-z9NA%dyq{0KC* zt>1CT!TMyK=^?KS{*>%5I}y*%jz?bP(q`x!h#t6=*u~X z^Ltk|5)bS70ZHCn`GRPo*kvz217sQrT~yn1QIQ#g>b|5)_22<2LoGrNg&(Lk)A^ym z1F(jd&wxSb|D3?g3DwvP>@d_MX^Uo2Mn3J9!c*{TcV_(2>Z(;n2+ENT05p?i`5F3q z$#`k7)BU@s!Q+U0pyNYx`@&6|!Hn;Kf9TNn>7D-o@Lx;Ve7x~YqfCPev<6ndc6-oD zELQ~y&Rv32ZBnDc^^QLA>I>v277PoH_?s|ZF*kYfhn2eW)!VW zQqKCcBIPL4=-FLZIllL&*!FzD{u>S|*fHf1)o9iE;sqRDcyHbOfMP)zbWh^{NO$ds zr3SZcUA#DI+QMD<1(;Cn-3rq0Ix}E(qS`$Ns$JV;K1iT{BAkFwODyAo9`S7YosnKN zIGcla7Az?ZC5T7qwb1qu54 zFQkp;=|eF3U8~g}3-Q(|p9AX)jMX>(7!r)aJ$F^<%{$Mf34>v%E(B~J7K6EK3zZ)& zQT2z3QwU)m5T`6C%)Uw4?DkUoCW1yC65V#+Q6o+ z?`cd}VWVLo4*h4OnC$sDD*2+u0gi5#fH>$zq1Kv(Ys`Z=MvIS2KXy0S1c7bG2PXn0 z1$plByD>u)eWs{RE}cHk;q0^4mf1wLKF*|iRFr-0Ze!Y_6EoT2WcQ4l#E7$fa3WNpcXG(v`XlidOpZKIX-B1bI{hT{ysgr zq5_^&A_1y~yTZ?N;Hij*zVm5ErY1vzT3S?j%GmXg3WUt&pn}P z3i;8XZ9CQ_`wKhd)-bndy>Hn)Kh)6d%QdIQ$JF;s4~|QY55nWF_89r4{JlLk{Gf3h z5H0!cIrRA@`ya)5e{<$-J@0K~mK5j@uzniw^{>kriu9<;5nxc zrUbCHV9oyM0-ERd^apF+U3TIcK;;59a?it>_#@GzYuLfHMA>5>?R&Tovv;f%5vPIq zosrJr(dfE%UhcU!xCBx^?xeAVPtlmZ;CBWsOsrZ~e6efdD7I7n`103MKygT@z(@$v zSX^f5Ox!NC*!!v6g zUQPuaR>dMCIiGu4xW43kyZL}C5k=h(AnTgC(Qphqz|u|Q8B9}PHV{QH=G%uA>hFFi zFhL<_oIwOy9XegN%DFiciLJlRD3M}}x&e07$LpWT9O-BVephj!?4>ehVF@$UZYMn& znSj2P{V7`twB>PXWJvt_IHd0U3R7GKV*A(8@nFgPrL9hT zgZyseURu@x$#|_7yT6}hvu!1$IcdJJA&pzg0C8)UM-`oxu8Tin^rK0%MS@FlqP^XQ zp`vH}Tro|m71LlIL4KAV!GV>x114R4o{J z`RN|h@bo1=gF~nHG-ZCSSUp(!uU4<$oV6q1M#}Vz2pAUfwIu-|u4jt7E*_cY$LCT` z^JKQVsCiO5P0%lxq#fP?&8fj7?_1#oZI6EmVBUNa%RO1Vls6Nfk+78_Tpv(xpa?7k zB7Twfr;H_X=8S)Uqz-`ONiIfdZJb$L14pwG+d$B$;s1iCsnbJd`d-uAyBvN~@Ae|O zV@z`Rl3qLAcuZ2i%-PX_1Noj*)Gi%bshquz%~aEc^61IJG;MuRr`?YR;wb>CRYzTc z!-3%mjlxkO*Gt6sBL%kOuIV~ZR?5nDffXAK38dYKLuLM}7~Di$aQta$=c3bH8~a_$ zIzN-zhf{AccE>QMot%$6I3Kw@kDR->TcC*Xmwy|E!74$^VDaI8NhePo-{t@7~Up#=F)Rv>V?#t$F%;4 z+dKA9Tx^v^^4}3)Z@d~k9KypVear*ldGtfsxsliJWgLyA`SBsA>-$dc8Dp^Uvg)`7 z34+LRo0`yaCqM+Yr|Wn1kLNVOX~~O|PHSGLy|mlWQ)jQYEh#q*6r9N}_;Qz!>OYHW zdMVvfJPRgOgBc#08jndg0~FfgO~J9{JtQNp8IYFhR^D*uhNXhn!hv*8|I;9X^Py4F z^EN{K0-DtF_4)QLwm5_MS`16D!1O%imJV2Z83<|&TL1IMzY;p+DS|Ik&5BKeb& z^#vq2Ml+72k_Hdf-X3d{4+}_RDUW>1$A6{!bNXd{t%4fID(Y?t67C!PS=VPW{wDL` zRM6;;kFQX2m*H-*8~k{x&=Jb37M3m)#8PmAHfAfN6O>OlAA1UHRsHjvTAB>HqFW;1 zD$VT+oVWK4EB!ycKX?|yIj92{gaCSI*LlZp#OERr>v55vbmz3U3#pk%c_2l$ zP+&Iq`7Q%xqc)Wb6AV{lW#dsF)NbbdJgb9>gy z%dQN_PHqv~_A2XkN-&x{BWj3?ST;3^=hS}w!no^@P!XuMH@{O#60D#D9o*tY#MhIw zyYT*ruZ9Y_+4(h@&E2d+pGvxF1YZ4wk+BH~wi0s)HPxQ7UayXS!KXLsXqvriYL zFM6Rxt!e?hqEq^$P%rIv0!Nf(`E&3j$tul!vJdH~VE^k?){CP0ikHvMXH%Y$!d2vW zLXpoefSo1S^RH{x1#KVhQvS9~Drj>lDXuBg1sPQd<`wE`9CWb<)JTIE1+cs5Yi>IW#Du0o$(@_Gb#adzYv7dsQT*S zEAzwF)4*P_j5gLjWh^OFpRmk^|tU`c&+_) z%Sl&H0Ga3DyH$v{Rj5&KvsHG2dd~VIu_FL)i4X3bo{v6DMf@$_Z(hzwVKTsz=FB%h zEom9%xy4Faob>IAm^jz;C{8uiNj&^1=NDrzUI2Hp%S?eor(p_EHkYRr425=kh6JUv zUan3Lzm&M2Uil=pc+w$K&jwjLla_pO7xQ0de0 zuT$GKNo%|#ikf?I&+dooG3w*;dgnNbtm*&|A`hr)N8y5?w09$wR%#{0jI?2k_{7y{ zFPsF@9{t7GxQ*Ry4QCOn$neXLF#G31OdQ9&L{a=D)9>E3Jzc!7i@-QHnrwXyT=C;4 z(%aUEiG9OLg-QX(1~UXv)Oiev(xypY9aZ59u&=uI?>*WLb9b-s=v@>0peBHfISu-Q zxlogDgin>^_&NL%wy`53fY*e9%2C-+m@m`4>e<^IaoYOJhFfXlzp6(6jLcO;a&5Cw z(1(_GyDr0Q$fCr4irB|-UVcTjViM?H?(Y~j3pSEttRlcj57ZUH%R{SpPAAg-xlh6y zKlbtWgU}$xUCD9}|I;ThNy3?jyl;L6KoX+2=h41_b@INSnHIuGS<077(+9qA8h#!= zHy#-YuC1~GK)m_Z^8HI+Op66E0l)lGUM?n>c4aVRVV0IwiYoPm@T)NW1%p>%Ut>v5 zN4{$DBrdk+gPn52h2N~j&5Dax&wLEEn$G~}{b#J}dT6E-KxV&esSgZv1>#NSR?)Q1 zUftIlp@ET+Pf2=l7yH`-b8hHKF0N&iBN3kiek7E~3KWEA<;Zq5Iwr@x!S*q4S%X8H zkUdWHL#C|egc_4M`^{2X-WNco44y|2baG^qeNBFG7&1cgLFhU68w#j!o1BMd_vV5h z{9qPcrb87>zjA9Av>F+OH>-@@V<00G=}wQnd+uMN^cKJIPULi$fhCyQc+b>JnUI!O zzw@(Qr;o}>fE+`%MUdw~18c-uAzzRXt6o;@bV^m zk5yLy>OkKwB_;OG4sYIw+o_%R^RN2+B zZOojv?VQs@*bUa-M%X<>*p2+GW`oM!s*(qd+u&HqmdhDzNXgZJ-(>nfk_g)qYa`;{ z67@4_9 zT#_*_4#LCv9hH;9`bY{0)#$6uufYT3$>dF`n_o2|0knJ95-kElyWpf%(xbO|sL_hU zFE!h%PHV%!esO3wwm9?xinmhiMd<{#d2iixv*t*FwdA?$e@Nr`Cy-*Aw#^AUc-HVV zhvx=3B)E)Hbe5??>E>&vN28@OQ0Ln#1$;(YV6aC7`~P9#3sGPGL9pd{=~0bk*g~v< z@N(m7GzlM|wEJV(Sq=lY0)6!XgN#6*5N7l{PTvzEDiV%?y&mg{77E$+9wm+*hU}Y@ zF(~%o*>82ks8uJAX<)iuOmN{^8JPX_#Hl0?2o0#8ZOu52QVZeSze3t_c9sAln1 zvIij_*O!w;S?ul84fa5Wb-w=O_%;EywqkO8!DTZ|@a=`xUd1wg9d%{!tF)bE+%0XT zXowHR6y0QEnOVRHP&dwpjAZz1ug$V|DZr_U0Y;*)EO^_H1wD^*9G(ie+XL+-?_Ei> z*cTw$6V!`6%+P^woaknz?Az4<0lUAeU#$H)wxt$eRAf}I47v<_4msrtfwi>ntU7LW zyq-d_dy5Szz;QtWB#3y2io*n01A_V+DRrdJ-`_86RZn$NkzZW4!Wo3;q_7*r`ComD z_`a9L+~58!PMMuc+ByF(xVZPR2vi&tIO z4s{4HTN|sDOIwfj`UDh!m#KoO572<{JOt6@;fkA&t3g8fyUGnd*y;(yXr6DlWhLp{ zNAcAVxm;jytJ~p!x%V^4y)_hQigG7A^`{>kGXvffRO%^0Cpj=_6~Ut;bE>(|Na~9b z1EaXUI#^g7E;zXo+IV+v(Dp(JZ4j#;1rT!g1CyP>5aa|CK|C7ouRh%dr4qfLKd5y$Y_>Ob47VXCq!A zKz@c#1~7pV-skvir13&4n7RXX;|tJ>aHKuYvQ?A|gNOd;Z=g9B-b4f|ZbiRV7q>Qy zxN85q2mn(^2sEyjNlvzcgNt)Ku)Waj>OD{du87H>azP_jX(#ELUTj){YjmkbKw}b` zz0SF&Tm?|UsIcIDOtb4rxSer>t@+;2uS*InepP@yTnGtxBVcoR`#0N2hec4k4fIB> z)=qKz(Gy(;#6?QV3RhK4AnWU`_FwPRj_8BMR23X)d)5rR3FFWB75oxjpkUe%EX0>o zTFmam%Cd~V(o6zZhWYQ2hP;pZW@h+*eZGZzUroLkTuQo0uogp>L#aN1#OpEb(hwCh z`pj@@^pAt`zO7AZHqFVvO`yC>01#)vv@5h>F-aQkXL#tO16bK6v=|HS3t4z~Kaysk zvJkleF5x0+5ZMq7XI#6 zh*q}i?NN+bBmn$={z-V`#gjpabB zL&~I=3APL>N^Z(00TOsvu0x;5!IkYeMrnnvxOH{c{x+L-z!SCYxwW1ymEgcSP!ZH1 zotqW%`#F(cHon`DYiPl5hEfHS3p!VRy-lRz1c>nHX%(cCw!%acaJZjJ$~s6nJ|DHK7r-E%#eswb~h>oeh%*wUBaA2f5)Z@7j&av9gFy z?gucylPGSGrZ=|r_1&mIxpx1o>hf_8B18I^sKw}UE)an0bg# z0^-Z+Kpj$gfJVp8^o#~(Glfj&pd1snE)ErF7vOI?mXlTUYB$GQ%V#;Z0C#_e1NGOQ zkFIQeQ(kA0ZM=M*b?=KFGqH0;SK7oa+P=#}|Dp&hv-@d9kIpi5#nm?E9y<1m8iS@p zC4wgShldpv>pswp^ntQO?sRL>-oh*VFxg;;(Ym~ReC*XDQSY*clx$I?E~^Jf)vy8> zTB=o=JRLMP>f~ps!B=a}H$-5Qzp2XV?!bvx?Md3-o_v#KlJ;isc+UcjYOg}ULJr|Y z;3E{1^oGQH@eexM4mEA~JTUxeVXr594D_Qwle}Mn89gVW` z(JDRuFH-%x*kJg5)eg`}(Ue#9D^r(lfLE0+7nz@aJK*9x)*J}EO^!dIG}{t}%pnNt z2a#K(-Qo6@|8zToL%;~AiKCxnq+mr&@zmE_Ohg!YC z_u`at_OJt=*PF=sri9_;<*(6?iL2v#jwk5N?-QNS{ z9dJ%YSNn~10K;_u{lS=-+61I+6^-N<1pp?@mMaBF1R-J|d{D`mn|AEEqp6Pc^dCzB{f`LnztR$%jJgdCY__+rE3mawSZ`hV++IQ~ ze6H%@`R5@Wj(lDn`)y|D8OXTZPpVSX7ZlJ;4y$_R!sklqZ>*$^4+crC6dh6u`|`G9 z;e7fD;-z?sjA3J9^#X(nblnI&!m7n$jdLp+^Q@+y+dQqQ4J14ZBgPiRhd9d%C*%R} zI)j|9fgy6b(AWm28>=+s=Ag_fqvhO2)QTtby&N2*)h{&>lZEshBx($n+I-y0abpG3 zF(w88Mpcf2>F=>yMu|dkD%#FtYRe_}>_$h-wHhM3v5u2U#=T{3r%T<1RpJWmLQPMl z2M^9bzaW=^l$++%oRw1q<2KxtM27T z3nANqxd;HF5RMJnueT4l?FM=plbGN(DAzwbh>4zh!%87X#!ALZbvsP-Q8-7vX>jz$ z68iLsTfs;Yx2(gDf0{CgZ{(g@sy>cH**s`UPOtHQ7C zA&WC#i~)*!L0_bZG}JQuADF>ATtT?I>RIzJ2;JOw-2USvALUV2nH?Eyn#;u-L)zA$V zt5h}H191*ETol+Bhl+0CIWBoJ%=c%cqwD-~Tr5j#YkMBZc`AA&%J6hj+@wEFGF6&+=j@a*W76J*t7`ILt!u2Uy; z@5c;?sB2zoDR2zYRqsj}8-UET8lf*x7(Z=u7_+em$1hWoNxmRGw~=TYYl8DE-s<(@Id4&*X^hbaw6sBWU)n zN4_AHWCVSYQjRe;EDx_BZ`PDdcAKi5<}1>m=j%uNj;e~WlVNVtc=0?NJ%7Q9IMHR| z_deHE4?ymMDj)XKcVmj%O01Q*;rob8<&spYqDTDV#%#wqzVS^%c3qnDrc`^-dkmMC zlk>+O8%O;pZ548H_8gJVK{-&%WDU=Cy_#f2&73_$oTa8ABPO#(e53%yFHgPukRF z`E+gkRZp5&iB9Jx;NlWFy5Z;%7{qgmW9Ck;BWS>kXn9~leW)o(ypD_C0y+|kW>5FA zbA)p+O6^0zOKHV)@`bSff$r3$)(5a7(RO5bh z-)8r;8k~v44m#`>aY(v~?M&g8q{+J#oZwgOHil%pzifyz=2Ws7GaZ1 z+$f*kwh_RI_Y|4mf6LNG3^h;SxF3&%ZrNJJg5jBA#|f{ zi1Ied-vk7)-_xQ04V9d5X66$oZC3-;eWC3d#>NKAaVBE7>xxn*dM%Dg^0fxUkiC%H z7zPwIGwjuVhgrq?0#r`Y=Yq0pKY0b++cVIC0@Ga`&Rc&iH1Qr^;U0# zaW{i#-bzp}&YUwez>kX&BD67+X4f+EFL#yJ~`{Cx*dz(H;w8i^GJkmMA_5No3Ud?b?{RM*+v@%1eUFZ_7|(w z^(H;D*ei=_M0p2#Le4xW$n}Fx_ad)@#!>Tlg$+YK>2{VHJ$TQm%kh!4{6 zba_1~cisVhD8#kx*uyb*cg6!R@VWVn!M2lKSBth+`@MP>=PKqPchWEItF1kl&Gssd zHk<1|YF5tPg6(W|GXRtLPe;6|?+D10`-X9x zeKV$C1 z5z7glV{pAz0OOGl(p|(0$lUcO`$BQ_kb=*5L#ok%izYYhH==#><$R2#s}hRrH+qnd zQTNg0TEF_-iX@PHG}$##Ilcl9jy%(SZNE|5U@KTstimCGNwn0kqm((O(y4hcQffB8 zM&w8VL!zZ>)&;V;@MR+MIT1j5Gam+dC|w6!-*;*v!|d&c$5^0JT7F*0ad|t|AgFS_ zDPZz$qVkU>!4deDID2}u@5I5|TcXAWoGYE&bclY_lg1|frA8ovEhmG)&jsRX%2TE-G=&e3LMj=ou zoC=3uy`B&9^l23NVPqprJVns$qSMAxiU|674%P2GdH6zFea$xG1Mus)ei86Dr-cH; z1Dr7yls%Y4ZPS4icuEr2M>(Hg6FYU5&vuq~W2FXdmZG_Wc1L`F~@A$Czj%g z_`6!0p)^1)qzjM_IzX)TIczqeLfiorI;C%{f;-KW$$Y8jzFu_~>hJYkf`662>m0@r zA6e5mBNWmrFrE!wJg5NOrCsUk-I0=w-aig6>>4x5?d~WC6J-R7wF}1l-_87N^y$-| zGu{VNM(nJ+fqAnF+kfLUS2lLe-sapS06O(n!S!l7+fDR?W{RKxNPtEmnz@$ma5VH4 zDEZ*2#d~;xkUSZ}TYv$r4=bGf-rBI;K|hFbwBoiCz8?9S^QsoOz3t?Eda6?2Y>yp) zIgz(v8?u2dk(;>7pi5oY9p;r05S=j`nG^hM5X3}Vj*Pc8mBCoS8)2=gRTJi6xi4P84!I~>IT~LFW#9*Z*yxOyzcKPX0hfVXZXyE`13dHPF8uyhod?C=w`*(k&0a>;b&E*+c~E#$pY`08W>OgqhjJDj$2u>i}FSMxpY zXuVKnpeM8VKBXgA$sA1>W9q+krtwpCiR=#z%z@HL?|iHzwOx0@r$skM@>}S{4Hev- zFY6-#%Dl%IYZw$%%rL$n-vT44u~Q^leebvd3{)1qa)p!{j>n@<#!I#N^EV`}sMwM# zEz{|2&k(mcgjM~)4!l&-jY}`tq~$qa?$_fi?*zk*=*wTn}f;(H&%}Tm4u&lP{_oDY`_~ zs|E1`XT-r5GY9=ke}39BOi{omLuVb+cXS6<1BY=_9^!xPzvpveUCcm2E2OzS8nV3t zw}S3})BS#-^lCuGMlUh9P3%0TKv^(?q;o=dUVKr2s;W)JNgeo*BSYN52FEwc%vt!4 z+zM*`5VddROEyY>FGs&14{h^bVvtXs(zneC;+B;}V=Q<<aitBxJgL?ixP+8BCKS;Ad6r1RbcK@a?M zMBJOTo0O6)0UNz^5?HXDugO?03=p;l&Z1Z;zECjS^S@Im*ST}NG?8uGLmSc(PmV|6Vc>qSY zaTj6%`EcV3=QdwO>XZk;KOOl#wcW0eId3c-*ifSyv-U(+OF_AozvZ%~_3^JX{LcT0TGQprrs?#Ax9oy14e z$+O7!(C=|&89g*lZ;ZW%2gDUSFWR)61iF6m=OJI<`}npk!DY=Jzs%9aCcAxiIkV>w zSc)z5&qeP=&07YM?>T0Kd=Uao+9S?er{jPv7j&=5_KP52q~pt6%`>h>q=eDQ2m;d` zwDCa7H>O+|0gL$-Et*+w19Dsooq!l$mmhV)a%ig~%kN^QB<%6b3G-UK-1D5o8;Bei z-u$QN(7c={ECjT^v~`BDk#i|qEKfabBift_Gez1nIw32*_iX6!Knl&NW6OoxafLrJ z!4(*reki|;2{=qPMyW#Oi}4b=N_YkKrc48P26WCeTUQ5meW-{!N^yhY1{{z*XY)QB z^C)!%vqOiK39Vie#j-%g31HNs$rttb02qQZ>B2U`h3y;>Qsar*?su_{J$+2;kx~xQ zf)J2ZBT~fNGZr}?`&kjSaDJ&b zq{s97D=gtQ!7Bai`-pS-vD$6i1m0m)|C=B?8J`dTQ+Cq61-b_;HZ-m3lz7}mWiv3| z2PgIL@v-zR24|6TIZ=EoZ{4|sXH<f($1wj_1RB?J;;CzIiYJ7_Vn>p&I#R)Rmg22uG>ER`BEhHAxe63 z6*7w!gZt~vjyHv;e)qtaQ$Gc0fRC#scHxkz0#7GnXWmi~ojA2a>jAS@S=52mC^<0d zi2aG_PW*@cX};GL@QBPhWl7MwwMZMv0O&9dXFnw;ZvyzI6Xsj77}h0$HxAdFaec9> zJBDl=Y%t+3*|^$XRmb+F2;ZkmMJKqDY8HZ9;r*5Le#)w}m$fgs9{ODbEcne2Ndug? ztJ-YRgENxZrlnFt{Maw#t;HX&qlff~$pqB^PHY3gXXNk&K)^;3O|B{&o1h>aZ#uco78}r+;c*PCQv6y)WBMhYKW^Mg}ap(n(Vi1F{!^2G7)F3u_(X z+7#K$hH!~6Fw({L^CcyWqTYp=!1->)ZbIV+h`{$xK7oabXjZ z%O|vnp3}T!qe}Ll=hG>lA4-oA?7hFV+_X1l2Sz`J;!$j$+XCyjEAjfyF9$D(kF2v+ zCb!HvbT4%J?DarZSy_*bH0?kf3w&30ra>6A$`-yXe8qK@R9$_U^sv5$DB8_JD1)B3 z!{C#_fIb;*n(U&PvnDzd?FcybAeMY6R3d)YL3vo<(%ly}r!I`v0_BC(_u87}3;jEV zJ5VJB%g)qiQAGh9g;lbn88}SghQYk$o6dJyzUV%^l^%1s zi;G&$N|1-*Iz>cadFZ0Zh~mlbhBafEz*63(dMn7@-s@J7sR{_67`jSlK7(~Z3ekuI zz%ZF`Tff2)r(Q_~yTp2?t!(8k5;XeOYPlqYYDO$BKPqTxTd}y-+OWB)E z-|Sv8Bm@x_r`bfQuV3K^)Il$m4=2{;q$+Ddx|QWBiGKZRToPT`Bj9l4Beq}43r#;t zeVHTo$(>G(V$j95k_<{nOo|G3i5g^qNqJt49N|~Jpdfz*so>acxMmM)*zM-db68%P zhpKLrL;T%lgE6b=3gb7@r=Bx&e0AcB%hXxr8`1HH$5cPRp9b2F25i*Rh5+4wI>Ldc zOP=E~8IwKy)5)RKi?jSsmljnFq`>Je<%=D%8k*z)PxWX_lKP|ko!4CT-)+apZ_!v# zR0xEvL|o7zpZadA$jW)Dzl|j_jE=)1ON>W6t$rqHVS1W1C$a? zDc77Bv2t(!paz)1vm`U90)qkBN4HDxR5VnT>Z@kQ&K5?AzhB&j>* z3ugn)QY@pmxS##<4|E;-A&5ETM3}4am26GBr9{1i!(?-Z6bXL)drf>E*~+j;jg|N`Xo_c~fU4 zAChBJcHXJjWlulA;Cn8+M&J|n?fy8tO+(GV$6FtB*-jfBfY?--&;6^u%Cb3q)Z;w7(+>=jwvxhMU7PQ`IDR!KdJ2MRoaD8ZI*`CxN zc)vKtNj8(oo!cBMscY_5ODKZ%9t<4*K>DzFh7e_gsoHs-J`WceZ46*bwfqCw+NdEM zwHRF<&(5zRxj+oc2Jsl)Hy7wYshv1mzGNkI=7+D$;(4IV#g6$AC5c>GwZLs~{wzrA z_sAi+^9V2nmi+bsfXudex~mDO=m*s>SR6h1d_$UKmoCK^IXi>z{i>7J{byZ(2nE*% z32t2efFkBnmfA@>m~CM$0>Qw)mVvr0f5ZI;Z-Dq7F$~|(B{k*f!&Dbg2Wht3UQ=j; zOmOUWmfA241hyuAFhzCFa83+DaL$3g+Pc6ggqQ zDg%i&@fLZoJI$8pALfSYG^yx)eIMma0hw{u*!bgyUtmJO`K{APrdmG85dWn*YO&zR?nY9nhkQ^og-u$&FOD$&@pH-u^ z8T(WS7ChyO_f%nKxq=$@`Rj4^kBYQ zJ#d(&&uUZBY6bFG%jn11frP`0=qT(L6~z%bwnxaW*?S=T8uabgOqymy*8IfeW=afJ z`9q^%yeWi>zNLi$xpcl5`L3x*No`E6n}=|ImxHYI){LB9U$KW^!t*2X%!$a3+s_F| z;+owjzifG|5k7P}HBC-8hN;2W^ix~P|2z$^4m(8WkXhKZDVtwO1Qag%+jGPR4W{z^e zIllAl=UyCly7MAj+Wq_qN^dk#?n^{?q1rW+}ealpxB`>SsZ?|{w03Pd2 z0oWTz6F`;cG3|iZX$fEw(mgS$o)|=On*-{z$L{-Z9kzbjYCOgvQe_5z=cRi2qa2eV z-ShCpc?Rvh={V^HxPT}K(GWkO{wU- z{F+oWKNi+nMJj*jdF{0_>Njr^zhw>+`|(gyNi%Vn^5HFv&i&1kU}mtdNGAx7dI4FW2U(Y;>lEw;(TMUu-B;yi zoD@gN3p{#Z;usDPelV40)fCQ)K=i~Rf)mH@Zz;s4q7f`Di6MjX)7$CFsY?TAR<+UQ zEZw(EfqEc+6$Jw-=y)7Fb9&9|03a;tdTI~73ajhv4g^Xqdg68hx#<72CGEX^dj0zz zCA|8zC8*v!^aF%?S0<2I&~V}Jf_|8*Z2mLiCgrC%>-z4+pm6vuZ0u%P99eeErwDKEP z?AZP`qL~~GES2!pXW(4JCu4}L2coiSvLF=fVlq)}G?~M|X<}aqLGFDHF_f-)V9zzY8;XMwrw&)p5CYbD6=lyZ6HCEWo(;4{14PXCAfVO|agybhQUT9XWW z2+h3xK4o{CA{S;b3>S992?L>6o5#829zjZX^_N`;P`C@gxymrUp6@h-7`FG%hyRy* zV|cklU~v496tr5WgkWcq?vy*X&+eeGV@@&=R{_P(!gj;6l{e* z?8|SYJmC`sTBJ8Sr)vxuxesH_GM+vrZ8{jg%N?d-d}NNU_V(gpXQ^i z8os8R7ve&*)L1b<)9!d2VwW>=touKJApa!Dco|FI)?|_*&nB;?61o=u%S=H|9QJ&x z(ezR!h~=*R&~zq`h^4*DQR|O_AJz*cr4B}RzIC@&wX(8cDUHrlef^_SGqA{~veekX>^?kxag+=YQOlBp++rY}xZKpgo8sfn0>$?*7g~)%%cn z3S2`#&Q7PWEH$U@w{o9E)!J;bR;8md3`#u*6dAp4Wd9F$C4@Sop0=0=zM#qF`4MA6Eyda6@cIyGNZeA@{ltl)~3cW2ylhUJ}EI`Pct(N3whcWK~99 zOW;tE2pPzWq*$o0;Dg`r^dM590JQWprj&^YGxF+!=_+fgNBQ3 zfM%=HelYbpP=hSlw(Bs4zC(a`l7J400=!Y}w#1?kh`T7j@6D|*S-{S?h=x6bN0jCQ zoyKz=_QVKfq8@A=kDI?;a`U(RHJ=vghuBo5KC6;@0C) zqzM30K`^U^@uBiKcS_!s|KYkaQ7vd+&d&V8Uu&@qsV7|Jh~N&Ww4*`H{R6;u@r#HE zzO($Evbm4B{g3Sd7=9-xfWapRT9~e!JXl=^kU#_gdsEU6Ao+isK(}oIXfrMlIra#1 zG^JrTk^j*0V-UuP6OqmgD3kd;(W-y;!SYThqz?k`fNrmDlmnoH5z)tLG@&7<)n9VJ zxvm&{C=#$w(P+&~zJr*5}x zq|y|uRNX9;dF(V_p+=T1Q08N2Adb5CeIoT|-hoc|U60hIPUi0I!MQ859!M4dptAbY zTJjt6N*f`q@O%!vs<;pT%^b$rP&^QH!%}>FVtx}q2WxOGt=l7?9T#bTK3@*?IBf$x z#IsC$=`R`c`vTXgW~a*5hoe$`#jxN_P3k4B3$wKk0 zS}1v7*Ds~4N>2A_C$NBGJvUxaw42e-CkS(TPmmbI8EB@Bia%=nFprYYs;N=<)ZlS= zgXs#D6J!lrz%=PUouOzvtDg=fSYrUTGlb~>nUV&b)cAN_nnsw9#+TO1(S#0oTt2{? z0}k`Sv6PGvy94D+84xj{-3OYzi(BkfKkgaA7vyRaU&*B2zO*v5L@ME*?I~oSSa@jm z&*f5AGhj6aiaBep9qbOg#+z=ppCJ72$pW5>e(kTr%Qd}U9oaTGdX^KL>cpq*o z_)0PKU>8AiI8>qG;AEV+fO_y_t_FhF{r{KuG!30Sh83%Qp)9**8!sJ`VDJhlE<~tk z$B|OqB55%dxH?V>>TZQUFHfzB)ppnT^oa=QPKI33EtqE)|;oBU}>@i+|jgGw#Yf z&y>YNtMTvK(trMe-~JN3v`O?igH=c05qPXSIsw#`yj`)uy-yTVE|bRD078H*oj&Wj z!8alpPXB%0-G2!@o@S!Sy8>K0W>XK`1vm3c827VBpaNJ~xZw-~$La(fufQ?lb3R#N zaBjqXFGAh-Zdn=idlv!oQ$)&zGsIw%7+ye3eh2#JK-N|Red9rko;F{tV>hd|Q!I2P zA;H_~O@+&{oFcr4*a#3D%M+nTdXgewAFq1m=yStDK}iJjC-Q%6&F?J3?(ao3^S;h-2}9PZ$oqiE>n7TSMn9SkEO=Hl15WQY0frCWo&-jy4ru$06~JH8-7I5r z$NjY71(+?VeP;uA&6wF+D69|U$R%c0c#$F`VG<&CG6vM%l z%XErY55S}qrv}2IQWm;JA$MvqkpGF*A7IRD1dREe#9X0BMVNmD#9u6@kwAHs`7jodH>lm#>Ld?rTKJ(zyR|jCuLL z!{9>oFCQ`o_8Ea~WF|(GWP)%ULoC&WJ9+ew8Gk`>meH=?EY9lZBu zE!4?bIZ7C51StQG5fHmOmnDx;)ONokK!YVrj;^Sh-`SIC=+GQYX<=mITi-v^vwz%N z2H3@&V!2}yI*Duf%Pn|EH@24CntfUXlKln;V6)TM1|dlXuyzhHoFj8BVqEXCg$@<| zc+tJ5MNF2h;_4sS=Redf4BmWdrrCS=@j5ednS)DLEai>xMHtQJi~^wy1EDlHBj(5J z5D&k7|Kaz1sxOPHW4wsZHklu6)WpcPya>=8vCv+ROMFN2ii<0_1W*8^2S6%Ke#)TV z@VYc|oFtbm1y@!y|LjUpVV0U)8W24*-vK+KJ(}?i1^h244u(VnmtV2ns$7=wx;FGT zPw+^rU+e3-97g!8s0&VIKg5B99|^Ue51Oy}Ylwp)giy)MGJ|f?z&57$$MEf#!u%xY&02!?LOHW?nuXh#u+tyvg%S1X9E|iVshxOoz3&Qehh57;l2|h zt^bI%<~Bbr&Hkas4vQrhj0w_lfjwQdlVHSd7e-T85xwkl_jXF(Tv@G>wAv2%{Q^oW z6W?F!l_1_mr3_j_pH6ewjD6S!T%`Zc=61s0Umz7c*?cb5J^F@T6(E5z=}#uwE3kiq*lt zwg;0p$&|H^|2z1XTVK*uNQcB%i@aw8BdfVnJw{6!^5qQAQN;2-vDeHma?G#%kI zKPD^DLF=)ME9gjBGrZo#(k}GzyS`SfurusU+5`bAnx=r>eK3z8;{TT|Dba+TIiJx3 z7yLU?_>7n?$`wd(8_rD&kObiQQ40NLG!!8>~&WxPGqW<$n^ykmisHRzlguid}?S%ga$G+V%NKT=oigdWVZcVt^! zH!F;+;i@o_#k=^eHc&%FuN4Z`B%5%%|JDj3;mI3rZ$8%vzS^J_0VzB;09L%OoLsD-|IdpW9S85;#pzWu33Bm*9$@^3R(m3M2hKF zjbbfmmf*Lz^#!l>1w+Mo`XmN8t&M}!uV2A~MX0cw5LO^Xw6u_dr&p;-5k#gaaueX5VDoAUL<`Q=aA3Cl_r!F5XhoXd6=ODE@INKz`+{oIp zNYwvJQ{}3j6`}-sazIorm2CM)<7+|PaD<8JK@f`HsBy&?DWsL3HKh;cTr^>~T z!{^0&3I*>xw7`!bt){S_XlNaB8P8Dvfty1()wP@l-0UPWU{+E9R-oNDKk z0qf;^_l@r)fP4|;e!SutVZRovFIh2==|49dBB!U@<&0p|*>J38cV6$PX-vB1Df734 zeuYx)z*7ff@$~@0bp#);XqYELMHVUFcmpf6;5gsEef$8nR)X^2ELZ(AyW#I^jNS|OSSMgK>p!elzp`HBm~_0W3V2`k z=9oB@V{P3j09zw+bAnXVrgJ(bc2SJHM1~vEP5dWa(1^?V&4O2L#v1G2*!^{V=FoIe zjA@LhDX>`&$n2hmyDCk9rd%ii=RhH!o}z5`xNPz-Jzq7GITCPh(X#BMg^)KnFXuJF z`=Qj*Jn{wzPZ505s`Y=?{Z0rpUGde|K4^mdECZ;(?3#%96p@}{a%zB=c%v!iZ_S_Y z{PB-Hsb18i_;@e`coqe=AmMn3@!)3dLZ6cZ*JzyIOB<)6KXzMz^Asm_1Xu~dhhmi|5p<)Dwb93?|#VF`I zn=4_35rLJSvS|vQtsh+HhxtCT6bb421x~L zg{2)HIPtIge0F-ZL^CRZw_jZ)wp7q`R!%KYF{T#@q@!Q6Iahs_1UD)}BX_Z2d*#W} z2jhixY**7;1TN}bK6?(*ZEb&gYN3H>Ad2Bndu#lwlhs+9n_xR|^q;an-cVK#Z?cf? zjHgypY25T^2mmgt9$S(cSxV_56LyT9g;N&ZZZWzCO2$Z%!@0(TK_|Gc2^#|ohHp0= z)R_r-P@69D6oa2HTJ$rIio>8y+p{~K2MLZ0{Uc3x=c;RV74;>+|H2v^+&-1Sz*qYI#EzGBT~tU1S5c=d8eR5 zojh&I9&Z6%%?<}&^4n(lfd{Vr zi1tmuH7v%&d@{V^ylEKfgQ0RrsGbPCRCYooN}|&#`uBSrK;B=-P{v!d4`^WC4)9%;Sa#&m*=zw z$X`%aWeu-*yh=yXJhsj* zQv?~oJA#7U^We(a1}>%}v>DKE4;0|NgHXQs=1hZFDEn6lqVDj9t^pI2GY-SPQWAPC zj{k>!dF40Dku6X@{&Q#dw$z{!gAvnl3mJpj_2PcJ&V~ez`jS$FEz$>&Ou|a_I0Jec z7&IRLxm0h~cFW7urO|`ahN`PK9fTqMm7D23tQdI+2luR9k1lKs>`{ z9<{H(vX7yNS2)DycktRmBHu5u$3YO(@6zbq4}$GK0B>8`g9iioI3O~0(B{l0Cus6E z05*HJQ(rw;+V?YZH9N)A!?3>m?3{rhl3I8~#q4zY^7Hl&MS^hNAF^oH%tByn{C#CP zNm*+C<&XEu!GnrW@?0;B2X>$38KkJj(N`|%z1>@>lA3>a~uw?M2%Yo zFom?D(r{^{K0)US7z9^!d$FVgjV-hgK>7O~-!-+-M%ev4@~Z7GJp-8Yplvs15CZ1G z9~$_0fQ_@wsLP-^7scDnbdzoR18{zvT!D=FRW4A1N_2!GO+rXL&H5Vv9hC`m$3DVv z&0lJEi#7?BcuaH*P^C4)2*A36GZWSe`zgmK@e3;!2QzUQIIh8aa3V{CR&PY3Q_=1$ zBwQ8#!DrK7Fa-J~{91ECG0;FGHP9$%JNV1sU#DHK7D?@?t4N<3oDoQ5iJ5ga4nj*Psjz)nc*X~#|6cL5fxsUUSTAPXWz8Dzl}Y8Q9J z!*oK-4`=z%XpoUmb>e&eI&A}K+#P&sP<6!R(Pzf|`*@>5aA*@egZH31L6+`Y-RY9lwXI%@G?RaEki$-l@I~{ zjw{mPZubA&;$zyyvlIz1TUqso(!n-A>E#}Vg{R(DCQ1vr>q#QLJ{Ht4FdI~C-u$oon7>y%FOJIY66a zPp?f5YQa2ROPC>lOD8kv2M6Zh`4c=Um=-Trlda(CdGq%@xx3E<9?$(<*m&cz60bU~ z7)*RcGS3ad(H)Z)U{++!WUegsLvMs*@T=7!h!=NIAx{fE z>m0!Y(M~oF0xgY45`}(yr$Ngc>}(SFo#wgmj6-BGC`2 zO!GbD7&q-5QZ@SxX^_JNvlQvrcpIQn#Wrqypv`6p zst}PL>jKB+iP+N7S$)EVBc-#DEVhuEb609lF6tBN%exswq96p{hEVgxFJ5mz;S7we zeJ*Z*f#Ef6+jwT@>BKz)WG|>x!P=m!u0bI{bsRb-dvYV79i-Hl6gV>6MIsF9#_+|z zH`H_Kn9D&dJisiFfyBedKiMnq2;r!&bb#(c#`d9#xvLNS|tIW(rTh`P{(uyvR@K7u|sY+6%8);2*j?-AD_}8)j#&> zq$bvb>4bVJu~UPrDP08V+xH8E!#mA!@d{ie7fH*Z_YZ0 z|DnGdccm}~4ivep^;J-k74`y0e|Br(>4QGOzDOZd*${fsq4y99uErKS27+Z5kXFt? zxH0VGc9ax&>r+l&!9J{0DljmLjWejeV;&&t0zHr}tOt1_$40Ip2m!=b_-*rk%qqOQ z;q=y$3eu$s%QCyG-&#ZxTm=Yu(yw=*;ORNT2zaHgJQN!C| zggrmWhc*C`4zD%zBY+izRr+iojZy)<`}+Ami8kpI2k6^uY^b z^u7X@&O)-f-ekzC-=`6;Yay-m0|H`vtp&ry6cGAz?~g!W`KK7ZKc0B%0B$pj9CD5x zzs~VbKp*0`C)sLRygR+whxiW!>7GOs@IXA|oFwrmV!fP~XCa0hBcO2^uY@UZZZEgN z6N{toVImgEV318^#1zSqyd;^6S@WVi(YC(~_!J;l@RvO^Tl^*urbqevSqN7!-KI_%U>_G!> z@t1$!)yzH#q}%H`ygzOr$ZCC8SmOtx!=@H%1^94qx~ab3cAaOIy?2uQhLAV_Q1Zz1 z%6VjZWo`O`3&3GGzceGo5d|lfD9glUyWT z&y0R9n91TUOxoh5kzSr_roKt}%zyyYboIFYbB9+I@2PI!;_3Pi0Qg_o8Oer=xgF4g zHU9`U-own@vaLHx>gc|McrK*!v-rfE9JVMs{fjBfFm)9=1 z(pVgr4|~Jc0*AHU@`pfl-<~PhXn~Qyo zx~FYf@R*slRE$02I{8#PbWaFKT1YK0B;$Yc4w}3c)lV%;w>2pod^npUWW1#CZTCTB zOV8u(@_~$AM%r*+g*-Zjxb`~byMI}e878l|VqK~W2XQR%=AM`2enIYoy%w9o;nkLA z)T77M@Hm|FiWk`Iw5USo<+$PR+k66^$cdZFkThAo2f;bd?2SUqW!)&!e@-f<{odfu ztiCOCJVSPxm<%Q`Xpw*R7OzjV4?<1ZTiGps8dL-LGSXMN-65Pq%02PU+oBxt+6FGL z-Zs^g1BWpK)`|bzUvw9}&>~A^>{)1+TtFI0|C^*fzu=1Uz46{UT2l6R33TN|=>drl zx^}x3;lXA?mQzVFz6e9vr&(6~PR82i_+RS#Dbi>{(ed#ws*aqypf6y-9mEW;z&mx6Jb~+^RKw; zIWX-SYu+L4uL9A)I`U$uV%VJO^hH#j6(F?Lcni9X_e_{K3lKX9ZQFd{?*3{L{L{)z zU*M(meRfO{Dj4gdeqf4jnwSS=gP3(t(f|e=*L%`|$HIw$cuUcsa0Sb*tzJh-PZc_@=9Agwug6Q8N zUycxn2&XsJEbRnqT?4upN?YBi)zgUjwsh z_R1EfNke&UOQWUfs&n4}y^&R)&)6IlhB3rHd`>$57K)woX-?-NYp_*L zHzXX&3&4d)jAG(8#J)TR6c3ukg6PkNN?tsY*!^9 z*})din`={rFJ54HYYLCs?egmrxU)a^X4;WGQb%fGp!gM=^PMk}=*6~s;0rSlxtaZ7 z3|!_Po`%$`p*miw0=+6r>&N|hCvQI+os!3xko(Fyq3{8Q>I(20dVN0u#}PETu-&~d z_m-f$`0LPVdHv;UloRrAYP?z9%0kW?etr>tDIxzSGH(q-hi_>U>eWo zJW%pwAEd65F+;9v7ld#+{*ZKz$MU)B4G_(ES!4#Q@x&}Ot$sN#1@Zj)17RF(>YS7B zS~SRx)0Z?m-3q#ZyQ;7Qi@f*T5-#`fp5~HbtKl1N(c>FAN>xC^JrBd=YcA6jpea2? z==l1034Z_qo3f7sdb9{IUVvs`q#ApW6JkgFso<%3G9~hAv?9dj@@CJaRuY`Z8WwL+ zyXM1rAb%ucsU+`x_q^c+xFbfPbn8fo9F!+1ar6K_jdR<`2pnbUW7ZFna5m?X0ax;n zUu__zzNT0Odh`4Rk#!8Q4K-0+>BG0h8y~-04VdTe2*NfoCjP@ z3lFM{l{SoYX|P#dl3F89l;8;RPS5&AIhtG2(puMyZd-Pu7~e;nzMosX1i(9Fs&6yU zaaXnFhEe66wf!qLr0o2#K&G-Vn?KIT_wl~~rJ@+8AgdFxr=%OiX zSNsH`&{vMfnPgP*x3Y}0>*3MhBhp83_rDGxmOLo~BJ~xW*aZzh%7L0%7+Kn7N+K;W zrMUyLZBhsCn?9aR>mZ>G@f?(ceDA*yZrerzwmz^fD~GlTC7I;*O>|QmcVM4_$QpPQ z8=doj@M%6FZ`*YzP(I=y05iwEr+s7@kx{5LX?u!s6mfjh0>}-iZR=GxY8~Xj?}gj6 zS?CHJ$Y;`ONIN0)e5^L_mc_>(b_mn(I)vYqJwY1?8%zHx;Ms5(U8Dsdqg&KZ!=QXqAO6Swd2C*B9(C>fZBK}be#z&T>OoHuUat3#T_%$Q#1clEl{^GH-P*Re^v`TbO# z6zX~rexU6!$#9-KHvH?y1tNj)$+`>>>4hAW+fT6=^a-jcG$V)QQ&dY zkFL^gURZR=Cua)KIlUONaUf;W#ml1v%EQpI{dEo7NQtcwZ-vA%bJd z8q3_qmp(weMj$UKc$`(khFqc5(OO)H?m$X1M_lok8m_{TUfUKdwZOI5vPIvdA;vhJ z*hn>$IXsMpaHTcR-#LIlZA_hP@^7_iq275O7-S;P{Gp>5nGMY}KR0yt&rCxKwTiy3 z8PDY9asK$s_)r5b1W=(wo($MGaD6M-n-bbzhAjwubLLseW-2bs9?KKRIC0WXK-suy zB&qG`^QUd~gO-HDFL6+sFw9XE#`L}hET$I0^E$5GH?xgX7`$71hbp((tCj2O2c(02 zp`c}#yVU{{%@pdJ1SQZfl6buOxPZy3P59$|1y>;eWU2XwELwYCzO}v;be>bM*{wS{xF3}eT3sv4E)f$ble`Vz z?z72vo-+*v1S6f-UULD`hd0SAc<-3dIp$d+>WsDsHFYlx4m*EO(gG)bng>{IUUHq? z0tNjGEhZlsR8t%|8g^e+IA0T^SfX&|9OZx(VSi$d4n~MPa(vG^%X6d7pI_{k<$2b(H|Omv zt=NO}3LoyEr?uYfK!9jPGxnSkX8c#a(#b7512~CWsa%-FEj+tfFg?#6f#4G^iHo#Wu`Rl+V^Dz zl7aPzTEs7e`4Um6R86kS@S)s{wR@*hk*mJ4!zhHX?(K{<)e++zaH2Zu8=$u!C=Dqh zC^U|}gTc87w18|-2ikYT9OLdjX6FBbV(^>c3Ni9b@P>7M9&)Px$J$rNMU{U452AxC z4%jgu7y}rjl2Rrzq=JY_Dk9PdA{{#BDgt+;5e!14rKM4H2MMJ+hfas?-?@OXuAlFI z$SW0&U4Rmo)ho$KIa)#T;x)q`3%5EGDgwKT>LS)Lhd~qIhSw@?>UVl-rm4; zt6JZ86HfjpBv4<0r!mC?U}mOt4&CIzZO!7qwfLEgZgY0qp(T*;iz;a#*C2OWsO)pE zzralAEHb|q^Fm+(ga}nl-}5~#t)wr0g19(4Uj5>N`Y8io0FZ1_E58vPu>S3{<}erF z?bXBU&&qex%`<0aW}*X~e~Uf62*c8)tcYb`PP7pRZCef&mYO8Gx!pS~XpLUViZtv!P87JNrIDFGk$uT%|VsZZap5Ixpqq*~z`4i~neGxW%5 z9vsBma+d`w^xR(7)of2Y?7lb~in(UH7}oB+1&Sex#=fo4t9Y3kBbdf6KOK2$A;u=O?Ma+ zVw&ej4=@CaQcHN*Aysw#_(<&8@~zjKb9NNxiRfAD;RTZC6Su{$5(t}5To<`BZC!k9 z`(|mJq~i3dTi&_HU@DZA+#rKbm8%bC!hPdqbW&CH#|P7K1V$P1qlWv?VT3tZ^FV8T zaZ5$}@pfs=x2xTXAa>=o{;c9|9+)YR-OsIm>NV<`Dy$oR0^{I%Jb(%y`Nv&6$t+ZNv~FED_6l9{bg7W)u6Ujp zrt6iiAO7r83-t)Ou$l+6nX6}Eo+&LN=r;cITW}q2f4qpmcCC=Xbk;lwg7!=3<@h=0 z>5ZVI7I@DkosvVz`VI_(KKm7p_I%oIAS}B)w(&j<7!|5<%C{@@Uhd;wvBfhx5lE!^ zO%lL33X_4t+o+tMV!kqC|8a+duH35nmhV>cHLVO5710&%=jYfh{D;LVbFS8^X;+yG zQ;9&>xV7&A#AtR5J-biTn;nNwegtMDFY_8)3vqT2+811v)Bcys0hoVr7;N(P!-21P z7$aqDH#e@`M#7$iN{gL!5V|16_i#D8io*GAxm40w&xn&6fQaR zO*HT2YSz>++3g)ZpvR!saG3letG1zES7g4UXu7lyuH(R$1)g$c8?|=5Znz1CV5zT{ z5>8{a6x^F^vcn3-glGZk?Vt_*3U!^vJmHjuKPFzI1Uy+-kC8Zg!W%-xJP()i@p3{4 z&P(vBC1B5wL_b2sd93h^C!Woy6h?mv=XyPwwsP<%O|e2hb?)i-o$)O39K%-ltO#Ikds1Y70=Q2zOI z25VA2TW^CE@y1d<3CzmD&^DwZ0QC9-QVpAx!5`U4b}?yG(7(Ji*z(by9CS&&XMhJo z%pgmz7@iCD5d0MEd>ofD3Je;h$G6#4%V#TdV_ycxTxNdzM{dw`X~s=MH&(YOH{D8W zwXJ=@i+U4`4`Og)vb*UHmif^&)NI)pM4zp>%sd^LP{XybKQju2em;~P`s3!AsbU?c z&K)>u_jWog3lvlT)X>`{=eHs*=fy z>!J?8Rgdv*MlH^&?%bR!`FA;AdWTLjRM<*kQ&g4XX$UMP&gYEUp8r7aSQVG&q<30M zbl_udyB2Tf7XqZ2LtnjeKEEFy4a7LDpOko9oL9Ab3k$qbU=*EA@)C{xn09UK5IVpZ z2l}NKFs-|Xu=fDKj7ha4NpE~I8QvC*t$^+ul*rcpajm|q>?=d&KXf17QPGliJ$hu5p7^k4%hTMXD*z(Lf0k8Y zXj0FS{nS@&%E1U+9Iq( z1;3v^Hua9z+^nm(E^-MB1u?_N4xsz#jHp$By60&_Idez(<7O&2=o0`XqzJu{a4TIQ zx`Kb7!)XAkue33_;kE9Ka?SeQ49m5FOFqJjVd9Qn56Mn`E;;`uYpKs2x;bD9=Hchc*`hl z`0VRCVc|3hOWt8t-@dEazl)Tv?2i?#`Q(C911wa3_Is}usX;RbKG zTnSgQ%7uA$RZX=rx<|i8P_>Wxa4DBwflQG7s7&HbBB97}&ebgIJ0l8aD>cUe6FI6B z3uDZMh6h7+T1dGLts(A-D`9`U)=8&J&(G64G1L^C0CZp0-l-;8T6SKI;~+UOWQpGf zgGbC^rd>#GUq7n0Q$H~`022xo%(ym};l35UL8cnT-m^_2QS5z!ZsPJ{PecZ+3R27Zck(9Qa0!PwW-u!rbWHxtr2^p{hI8Dah!65oJjCDh(UoPkGVX7NJmE5m65aph4E(|MD8Jd*30))-?&XacSeXnY>RC_9{OB!b6(PT(={O zKgmZKhz{?>te~UZAq~JH=gTvU{X8uhj68BJLVE86(B^W^N5kT|GdKI(?#a0ai0-nE z53?&oljZet9DzR#|?a-mWEnx-=$N^yb5x-XbetdYjq_%@s2% z__>AE!#6kDZX=x@ykou5GwOEnP1`EhvltEf9E=N-BpX$g6Uu>yZfba0uHD<1d2wqy z@W^|L2>L$M;oE!p z)n9By^=^cgC#RIXk8CBqG!h=RZjlHj)CRP%o?FEHg7=&4i)ZP1d29k}Y%s37JlcDF zv!|h34kl-%%c_RW?++L}!SftRbkp#3d2rEn{l_7xvAPMnY`DuxxI0_z=Q0CV9*cKm zZkEIQSA+rpwULbpooo)2T-W&xep}jt!A^}ezJR_q?v?0VxAe9Oz0HjZ@*C$@r#(12 zcmOii$ZMYct21wpCOA5_%$$C%^j&*4vU@Ig;_qmXr2|G8)fAw=g&2By#BJ}n{no!L zMzn9ew7`(L`Y>R21^cBgok3ndk4m_-78vl|dJr{C?*)!II*HSdsJVh8dVyz^%Zk}2 zqn*?ERNO}4ninFR&iAN%xxt?Of0*jUEPT6;VlQ1SUMyjLWTPehutdv+7TK1bGCpnL z$UK|AbQ2j>HOnn`n?)H5*&qgKN8y;h!gDbIfsd-`OCIY_l|wdW9S3I7d;IaWgN(C# zpGW}-yszFG)#KHu9>WmLhzm#L+txH_<%sIGLyuh~F|?VlDSduqmtJ_S9E9R%f$0i8 zjWDdy;*mQ=um1~rb_V$(M7Ketn;&PjB-cgoV$1hwX3zzC`A*%NrBtHPz6aGy?>hc`fioy`b{S_8!tllZZ=$s_szP1HBqdu zbZx>(D&(7midHQ6K6#&xvkR|fKXV_?reZu@3^$b>GsX^LqB$D&yb>iY8ymvTaa(Ow zQeQ!?V{eYbqY9x}89nKqExQLX?7TAezDIF4Fp0$GO=)IQ7G}Do27PzlyaNCBYe}np z`=y*vb7pyDV=5{(o6&=R3PI?#Z2z7t+CNyKnOzKh|G5S6l=-;1P|+%jJ5=Tt-B8i$ zEhlXTEgEhz=3dvkf~X49iM5)b_iU02ku_e)JZtI|>aoV%_8W#x^q$T*F=t4SQpi6RD%w?a_j4Rf7Q}QhH;)@QV!L6a!Pz(rXc=$JQC*Y6u z`{wTZCh+9ztEAUJi~cXd=2e;18p1bZ&Tr6KFjym-aEY?D=*(f&n0X)7BbRcTWueR} zP*wzC=T8Z4Ox40RpCr6P2M<1kk?7ye)>RuCck4K>VY30V zY=SX`t!Q)+{fDuF==6YJ68Y$=wT^6Qe-M#?0Sp`$F5Z1Zk!$>gcc|yNG|@ovtgHXpN-U?XEfT*1@nd-v za+KV{aN$ekhhw-xwnqn`zv!2w)1c4ruK%J~@Ga68>}?U4U;8ERD9pBXISQS6%R^?{G<<(5 z-NQ9d3xABp!Z@Q!xIv6%>)#+ilVt85s}|coNCb6-UC{dLaDiT{)0zxBIK5dL9Glv$ zrO~VLqpjZQ05g!}(YZp_i#J~_A@)CpJD{zH>YXr`2Ffzr?vza#JU4|GUkngbWWaQ+ z$95kWf$QuTYl{m&k%MsC?-a?Qo(?kHt zTO3QYm|$!p(FESTG_*owRk&g#0~tIV!Mpq(MdlrV%SX~5p=pX>&CybWHPeym*$2BgiIqN(Ba{uc?8T#_LSl4*B)6O*p!3NmV3yTVjj2;_Q;PpGH3+nDd9+<2 z8_-$&q0a~{{6gbRJdD(7S(w_@BXtC9CptYUw2?0NPVR;R4*juMXh%b@8AP`g{>hlJ zNXUc1+Dj9FhVaLS@W70PBk1Y`t-u8uFdQ3@0ZlE#(G!=ae*z}Z-f1D<i3_IsoAc(IMfmF)3 zYVh<*PT~qw_U`XbJzXWq`W{`lr+&$hEL`mSeaPkFScSY_Y1aQ)@3}6C^;(3il8#y} zj|ib7w&C@9jm)!z`^%(p+5ccw(9|A_&A-lx3gfwKaAs*FzC) zux5o;jRPfrzEY~#(R%h<8^ls!RnK7J@$RDkTI^ijOfalRV@2w1*X}0-N*EeZhKa7< z-P@it$_GKtBHiKtVA(-s{8xxIep*xFI~8@qGL z@#FJ74x&^P0-aM42h=fX_ zN2*Nj!fL0mC*K+`IgUFth_s?GzT9k5?s~h&vOR z*HpMqxaPU3D(M~D2c9xv}F;T}r>U+F7<65P4!t!^BDtTq&T zPyCUQD$XA-*(PYzTpviev+c7e?x-HWhmzIf3O(OOGCrtfy?(%#P^{X7rz$CMi;l4+ zmH{ynB^nF-x7J;waI=I+(-=t?puhX<$m;$MTB!Y`r{Pgml1)&WJZ^JBZHBp9Ma$uX zn#S?v>~grXHvfZ#yL-XHZOK}(JDK`rNo&t_C3UPKHc7ts_pE4n#3vq#<<5$RZ@+p) z0e7R0J~GdknNV+z0BseUDhWS2JaWv~a`s{v_MuMX-(_+>)TAQ5dPSBXg{hLQ<{@@x ze8~eMnYxq6JT?Ymuqnbs=Is)3tj7KP_SZ{qZ+TSOc_@YfK-sQ)P}X?|AGvUJzi^G_ z`7o@+6D4CyzjuCIm41{RiJtJ@G-;o#BE- zp+tCU;AVxM@c%^WVt+9eEGW^Ky&0;WgV4L)Q`Zssx~Knj>G>s{<611BbfqkjdDrfF z<9X)qoHdS5eIt*%u_q7+()R@2^AglZC)sIg#QA%@^nGPJR*qX=vbu)cv$2;{)g^DS-sxt&w@WEIWk7W@kZYuID22UTD0o(6cb`#`m8R ziOjpmtiQPjFU&T&fsjKU&ysLUzPk2SxzF5uo;8x`(s=I)K3X3u_n#GJi;IYD!@p?y z8f9-#m?wnNF&@ke2u4}+?QAPOSu3IXm^`ke8v%7F8`~=^_PNLh-=D;wN~&a&OKBuT z=E>pA?P1FocXSfn(Ja+4tmFQu3cY)8U}lE()gfut&NEWj zV#sA*q0F*Z_}s@eo_L;1iMEaKmYY{nD)b_xJn_-Jhu;iv5pjnC>)*1&Sq$M&CABl} z7d|)36!Uk<)SXs~z$5xfv>QzSyMeL<_<1$Qgp#uMmNN%Y00k$K9F zJA}^_-@II}gy0`lwD>T5JN+_n`oHXlga7k(KD_RZe>~2J*b=7pmtsHP!R{0@>*>`C zXpo_(TT6)oTzM(j{a`?aUhj5jGaAWPz?D${yQ{{N!a}j+ajEnfPI2may0@Qq+`bc% zVmj#=!9BJ6|A(&3Z6J6kTHQ5V)h$n2yVQx>n?{P&C|hF#n_Un z@Tf8kvGs4DW`~P9(^Nh$b z;=CqOY8UR7eRb`M`d~j(OY_MOgdE+@K_c$4(*wcA-zkh(y;|Jkz9Y*%dN5vS9xpIya?x3aj0Q!6R^$&z)6t45VbYl9eZ*UW1O zQ|Sbbr!F9sliBb6%+dXn__m*vrTq*Vh}8Hv_RZwlg2`>uz4~{%RlYTvQ`nDS$USww z6fdw6chr(gs3N^Jg50p1(oxn5uBXwh`X77YL+Tp&9cOUOAe|9=;`8i<^MOT73X z!h1YOK-JCB+Y}+$feEH2KnDdF6XG+a`T5MBa+s+o$6=x3}ah_qN}KT!xOlmDi-c?df*d)5$Ft{vOZ?VNDcqTof5Ddp|>#tpV7bJpGDS zUs%68MjRwlN9R!k@H(;b%SkW*jo%Eww*QGMx|k5MLtKhd8t%-G(>sN~9q)PY`HB)8 zKhY|c&^4Y48maa)=CSnu`k+ZOS|W&4yvy}v!GIU_N} zRix$Mt^p11T%SXT5fiOS+Fl4PQAHOO_2WA$^sI_w?3;T0SAGaRvRbjVgXrSu+6AGw zT1d=e5mYY!yOSC~tD`?MtGF>yC;~GFxi{UBGo10CD+pyimvoJ^bdcONPTJ?h}$25E=1do=VH9i=4 zD_L9mt+O%jEZeGxkjt{UZ(L2^zrrsdZtJS>8#^djNKjqyqqJ(h)O8IemgP9hI5bFd zM1%GTd~_#jD$}d=;6Ht$PpgKo{aqFq%c?9iZXZOgWuplsGw`1wvPR8ilreL*I3=q* zn>*!^_2Fl7_}hmW`BbcYxr*z%uDA8+kT^r^-&VJ@9IVemV{1p;Sr^9r!h3}68XVx4 zA;@z?Qzb_(qq&-GF`N*gzn}(@PZqj zKI*rN%VRjPS-|kE3Ml00q@d3q5_2fE#dnv`)_gTZ?n{%h9W^>zoa3vM(F`Z?Gb5) zm9JkOS^dcFz#DyIONlMvbJr^+u3V!)3f&VK_j5k!w7j+d?q#FqR#NKATokJAB%-em zgV$d_@Wv2*eT;Hw)0qKI$mc>MvVV@Vr#Pc4o>jD5`7ftg`fmUUP-^u;Dqz-&Xy31YStLXP?~c7106KB%uY zC2m9Gmkwf6Aa#^r$UZjmg%C1$k)9=V?oj*g5?x!C04fuC_9KCtkbWM~BurIRF3i^z z#?=Tjn7GiY=9G%_^yeW7VV05W(B(eVD$6s~cf3zZ3pWDLg;@9g_BVy$;$lVj!GKt- z;iB9z8WNrSa3|<4<{+FxQ_BMffN&|XfKVNg%w3e?lTvxeH(fi)7bOm@bmhowPGxBZ z*-4D@+(^W{)Dg!nSO04EDx&sy%A1uil|o2Wrfnyhlc_$$ShZ>Oj1PLXars%Z;U8KA z7xf2@KsyWM#-q2r@ckF6O1aXnkBy|OYx8{)o|t>Pi{kxpwsH$+`uyolvt=(`=I465 z>PGl9-N{5_%ixna=QB@ba#K{IW7T{u_pK=MgpBU%<;w`@uXGSKg*Y!w@mS+x#R=BK z;0{<1k3-J-!@YzdMVb%6LT4^WL$)BACU|rN#JS7x52PN_@}rg;SzSaPVjT<=5q_Pg z5zYokoIH)=tc-5@beC70??T<^tdhvfQrY6Xi%{4(e^g(9sN+qIAZxvGD_^UJ=3LIf zj}(LP4JDk!!C)#sB6&T215YHV?tbt$4pgH65(9Zw6R8eWs?U-dh{$Bx?{x5TEuRu? zy0SEcknVyEDOhDB;ojA+aR}xTJ~t3$$)6J`XjimoApsU!1URHF`aH$YUayOLw9s-| zhC|tEym$7h?uo4}eaHEA=bVh)o3mVyIL$dHH6)OI%=&0u+%tX)5#u$?2Va*I;|=_Z znF{pDvlDB+4v2(r6*vGsjDvf30RV5-dnoUa%-xjoG8bB62zmeag;#uKB^idBt7=6>l`i*hMkXkRe*VBiJfA$~?>nog>V&%*2YH8(&#o|Ya|>=EKM1ba=ymtb#%OjLi>Ii}V|OVdFlLbGxTJh-QNvnO=*<1gb$r2fYh zEvrGyj~Ahs4OiwP^O(q)!e+;YW1>PH-rHlMX1gjbFoihz^yHkAW7VWvpR7UoR<qG$qWljsCl(Jbv|M6?-o$Q-xkn!7Fx}u0?WHg4ECqyTtAeK9>1m4 zZO<08+hcZUxPYkRlQ6iu=2Nz42cLUP>{BXeNm1{Lu}`9nw#9jf5i|41dR~C%b}WNX zqnG_HjEAF>bT=*BO)Abk_;HWP!P466jY&QE_2F6kV`gM01q*|6HnuCrEh6~B1pSgY z?6O>^CqEwxD_0<`?Swy9Ov%`bcOvu5JgyO44i027<^UX6aZn{P?=-u8O=pWHA}K?8 zK$Je;?1-xrV(_rZN_vn#!#U-Zq-&5o&U|%^kD|V%XQLOM?IHvpOG#!vbo$wyM#$vM zLuUHJFZF$r&*z#R`k)b(B{MdlA(PrL5p05LVe0AXJ?~6)_QWbX#^vRdWXgQZXq6gUOvO0=pfUY>1J0iR1=uO5{Nq+NhrC)jmq!HG!Z70t;lcXAy_JX*&MC2 zCpcuB_Z(wW}Ojh`8`pcEp?90F@)wo zYD5{ei8%jKBQyBqXi5))CxvKh%Sah!?|;GiZMSUjw-17HQz2b;2xv&Yt0oqi_jcS~ zHZqTkVuDCY4^+!Bhr9Wsc{==^ID&m64<9%%* zAyntEC(uszE?9Sjf9X7&K^()fJX%$C2BtYG>%&Z*Ts+IaaUqC0Pn13|qUNQ{I^|z& zvNm5!Ta!_b!tHP}3>zrkUs@-1OC^-jNS53~>EH~>FBTSlB`%g*G#D4}8==J1w2z{V z1XY}AW@|_ntK^s;uen+2`j$X}z(XHl2py5yEzE#!A@iW2l#uoL>{U4e!f0%8FEQNb zPn^)@tjN6Zi3>{S9!4QSX@@?}d?2{`?F}GFR47?P){`>-@Ex(qlUiNovS+-+i2PiG zci>sZ*NckQmL7QK;iH0$jQN|0F8e712UV@(158f!VKyHDsKow7HBZm}6SmU@T$BxD zr;|wPlN*0j*Iy-v*o$nN+kc{KMEZiPGR{SkvLHtrBf5xF93RRYk5->72*;+*lrkWa zQj}s;o3~Z!kL72x-g;``W0%C~m6S-M z<_*(*36CFC3SndD&#l27J=gG{=@OjZxi$vG$+b@9ypC4>UPyvLKOynoMjQ+rSEDW* zq})+w+ZBox^(WsWXYQb+a!>UTI9~UzKWlu-csT7>T&zzH$F7Wq&_2{~;=Bf;;=6?I z)w}NHlc$LqvF=PgKQ~lbH1G@pqU$(AZ+s>X#ey)EO&AI(7H_fAO}mM^x;Fok@@Ob_ zBF)Z46{0Nr)-w^7P%au6S))pd;F@|sSlCOkE)V}yD05s6H!jZ2!aX%pnJ}b5c6!nM z`~0xtkSYm;y?da#VBspFapiSV3!e=cN+u~T@?Re(8Rf?jXLja^mR=kKH>myYyz?!p zcT{`(hF!u}w_^bKd9(qrDq-hc6jvpy)X=HFYG#ByPy?K2INo_jN}Mu)G>A|>dAI<6 z=)mH{I#{1aP*JAw5?y4B`1W2~fQE$MRS-KOurh%noRjWE7eTcKP0Ql9L?{qxE`+7+ z8o0MIho52_K8K&)Z>%||N;+0;2{7phZEC`i_N6w6o^Rp~Yxe^%ebdKPjN{w)Hh8H# znLAM@TJlNe;u93`Vh#om4q>D%XSy{add5Zx5X`b5Q$B?N83h{jaM?bV_f}3H`Yi(K z6M~1W9)d$WIux1}cin5Typ(cH{%Z+=Mb3&`$u=#Ai_$f=?8cXLZXkdQR7V00K8ebz zyD*FO+N2b$u)Yx!p77VjSaXLsLz6Y;(uH1e!IQ0*RJJlf>0`_^qb+WOvpOOpM;qVA zuO);%S(jtRF`!A7lr~edN9F)buePUj@_&Iao<-GO-x9zOEB*MUca;MCNxQ4sUL-xp z;||RVIr{}&SbTN4cUzs2+F2H&)yJ~nxGOXUzZvn`=ocLkp>y($6FS!mNs?bN5}Dof zpCtPNo6Svq@C`jO!CvEiTZjCqMcLygjpKuzW5tB+uAtbPiLoiOJnpd&x2>O>9q4o$67zCI+x%x*DR%ZGZOh%oX4YZPU4O z8G_M+<=OYF?-7Q^qUrk;No)5^zqfe?2#vU=GZE3`vOia+(x>cb-me4YmcR0bgzZ|5 zgPRUe6rwUkZp7tzbyDj*#@mu~DI*7`{%n`Qu z>MSDc`{Oo7aHi|lIciG3&Dsp_o7z5i#X2tU;p4ZPT^<;2*RueKCxJT-Dq*&VG^ISL z2}Uw8GrqMSl^VjZeRW-MQIkeAU!BF}~c@ggDkq&0*Nx z!f73-3tcS2EhZZByb{8bcL}LP+C!rBX@|w~ZOp8ylcbRgzmf7eZELO5e-#QBh{U$? z0LXo!ZsMwP&A^4NZtYNVDR`Q;8SrvS0dd~3?s&0UdDE!Fq_sW@(o>&B=0%YuIVq`x zsjU8CBdf)er*!_{Y!SelFf7w|G#TLa5l7x;(_ixPIx962#3qqRsgiaYxFyvN_u*Zb zO&%VKiIoa|^LF#z5hz8ZK_5q6(h#MAXTVWti(?ht_(|BYAw)lZ!(3D8*;3*R*HkK( z{f);)8|86T$)%gZu`FCu^_8O}zCX0VO$o$zI zyYti_=gBzkX;N@Zus5}s3RM5C3IC*o3l63_mNlL1dxKx%PuPTEZAZK+g(9c zV@oSX^tUzDy>KY$-8EO)XZm|qK}R??PMP*9X#($ba(Tbrs*y6L^pKgbtj#WMy>$ke z%MzO2K+p(x_UH(YvL8QEDsor`61_M4;)P1ML6N$X$m|8gLXozm$1{3w$6{dbpOupz z970vm80i@#HffF}L+&YOZ8a+Ie1M`&p1pBn+Vb{qp(&q0ypv(whZYV_@l#8iW+ok( z*BJDa3KvQE$|zaowV+jg@dzxxJgtkEy?4No$Ivl_ZW;iwCytcUCygyrzesygTZ!3x z6pPDoaXFr-)gBMVJJ}+-=ZZsQ`UePx9ySgYs|Z3)$awaJ0^dc(j1N@3ioJ=!32##X(DdaJhm$h;C9V+W z0F7rM94a$SlnrIszAJLw(CyWw98XBp){W)+bc?x~c7@#FfC zWj9S#mnhPL2&D?NR{6r(kq^A0!so_bT+k=qsC~^EI_D7Ss4jVJVqVETPoMqS`Ko#4 z1Bcb-UADZXQ&M7$7EGJ>5e3oBCULBp?ZSU6e28uvyIq+)>`Zn_+?&#jKRa^tnnPXv zRY?mQMYiG-5t4rqR@B@@v$Qj~{8m;{yDq0tyUb@>F7QR7l(EUa@ud z4B~oDdv#V=?58PdQA>aKy!nZ^x1B9rr4n!$k(1o%<|j7TW;H_!+3Df@w0oFzX5Qw- z2J`nwj&joX@L)S}(2J@s{6yV4{+*5q^SF4MS-A+)kT;iTVSe#5!AS}%wmJ6k9rEWL zD{F$$g>A$gh1w!VcO5aCf55qC(4X2jU4vRIcKg0KZBHts{eI)*wtM^b8We;ZR@zT@^b*2E()I;QZ7?tY4GG~eSv|8cIS znYzU_jRok=Si-TfpXxo@edpwKG_qbM*9I~GghRox`R#_yqRn@mlxOV!VhIHlY0n0(RkkmV ztd5t$9d(m`YUyFv2!;`9*h_)PsI9St20Cv~r8lB|AjHXAsUj0+bV`Cnm5nWZ5});$ zMP*9@Fk!CSw(gj|rOYn?vfov;;dFDt<`e`A$cEaWiLH6z2I^h8B(g}$y6(AI5bdAhT{3m zDs2`KyKJIkUCV<-K}w4f7lYS4KrIE97HYN zI}k;-t*tBt4`>R2%`?@HLaRNbJ}ndyY_HbMY-tjqq((UJc44j#(T5m;QylV;JM#*N zC}FC?bB0IwT-Q9r$o;lt$wQ<}|CfSde+>eG$t5wWrNbbYD$7pmW2cjk@@t)|;&<3zHocEst( z49qd*7>-%j6Li(ug}ZYj^HewicuVEBH>p!O;d0~AoHst&wpp0L(Yl$Sq7uh(nr&%IU2Mn3rYvMnSA=TVqH1A1|sI0u2!ddxprz3r9}#)6>wGQ3wTnNqjH@JXNVtF;lt~Q4=pZ>H9BV+F;EUbS1$49lB#52>G=%LpW-+tkJF&Z_JUNtLt8 zI$$i;%~a4zFbq>-fC#A3NM?s)u(gg`2UMB-D3KQT$SoshW%#9fo3&*q#fTI5qPY1f zrKpg&fL>Ea(#}#9npfqj&yHo;_SOzF3xUVfbhYJhRT)D8B$B;B-DrUf=hUCi`y$2D zLS!I#c3Hbb4h(8%8aSS8XNyS0l}J3~iR#q5msJIL;Crjy>4eJCPae~@)#tS*Tr^{i zwwh;cX3xBvwYmEitdeq`DD6p|gKEi+P2BX`^Dt;^AwVi`W>>i#Cl?s%SS|9daR;S3 z&c!@Pv9oEnPBQmVu`Xw@{+d6Lqo(3w4f#dIdRO#((pVT|vM#R1x?GE$n)d1I3Q!Tyv8TFO%^&V?<@*%oRn8u?n_^(w|}NlCO7ehSnOSFo8F|=-m~CI~VEj)YQOPEG@^D?;d%jrlSKsIYHtA}npOS}f zPvEthE@1VVV`Elgo>-*-pz}(}B1fcU^G4{|%Va1Rs=ur9xU+>?LaZk^EpRP-uO69@gq=XFkag9|)XE5rZ<<(`KA)9>hX z_5^fPWC<2v9H8QqOEs*2hg;-2`v&4ojdj3-sFt4@VFSEs0Liq?8EY65H5@O=@3f#+ z{tk;OsAy{-*j|`R^m{WtS|~Q75Hu|>SS%|tW@cq@QYK_aLKLP0e5_tsqFH2~YKTc> zUM;{}>e8-&hrT0@Wb5qX|4k62c=ial}l(5kvoSJvRZYs(hi!sbTL6Qkrc?qsg!z!*@o649bYe zQVr}i`6@$}EG(_dB9gl&$^StbHa_?ejsmsoK!!&k26Gs^ zmfl`4olUoHq1$A=9jgvaIoN_acq97SNR?8f~(_5-&3+iYQ*& zNeA+ToWIDwqNPUj)UY)#6xGl$YcrrVgEGCaG>$wwbvVoe(#%(#%bkD{CAhr#GE zf`9CU)V!Z}&t$p}KKce)X@B38?e=YSGlq1PB4Eu43^H+CeU9z1L5+PB~ zfYFPD<<|JXGeEcHvA=8a2KI;~$*aMYZiq0wmOvjB_(1`!;|bsF%Q@8{9(0Hfb65jT z2^#=?6+piBk$fkL64H-|(i#X8l=~BY2tK;?4oLl*h<#Ka5-9J;K?Bho7&lH(t(Fm3 zFW=I7$*^9w0V8{DM22r(Y~SC{RbuD`0&!lLvf=3zJtqD-{3-!hYpFo_-TcIELTHhEeiQCg?s z+8JZZ+dmpzDms8zWM_&@q{A`9K%jntjOR)I=@)6+#bqe23Mv!3f&c&WcWUbZ^)rz? z+asyMM~Bf{0Qqi))S9|1qgs&Bi(nr}_-9p{ z`@MI>?)?IhHm_9pT6{Gomkl*Fet%b`N~JbvHJH-N05kKGseE10@`X>1_A1t3jQ1r5 zQ{)c^R*{JFxd4Q6#Beekx-!n0(Lrq|!m)AtKYlb?M#1WuFGNNwFaoylsRwue{Zq%t zlVqYxOzL8N7S)Dt4F;AH97I~^T$PgXT8vv5xKY1#;6#Cde~z}M`8sqZ8CtJ)zKCoH z!I%KT_cC{(OOz87cAEAd=~j_-BSk6^!WNkw!)7i zvrjlJupE(eZG=k13QYWQSg-dlx|H(q3llOsK41M0c4)(=-3Xgbgt_}4@F>t_G2RHC zCw*BB!K4XTE8^Ju#ECk|P5=Da$D-W!9Xd9BJ>Kgu7?d@Z`zKr`%UW{{2v&}~ql6h~ zJjmJI#OK0EG02Gf#VhX@PK!M`s4g0L1cL!V?RWraDFkLUSweH09Y&pf@kQ%_B07B) zk!hI!1)cWBH+YD0*$*f~IcO!u%>?!6fUf-Wm!&0lQZiCw|M|C*2tv!!vVoJhekt_1QM*f4Gv%xdg_6eAA{>pgKnLy z%?^tdnC5jBiDU5{>!hDjS@z4k-IDghC<75&>C?0?k$GaW5I#K-4!;1fp&iYkd^k}y zs@eVJTeU>*<4HSt@fPp=N9yGuM=R z;p4$oeBexeG*iXBkxn2ozuJMp^m~Ac^FZ-G{hBJNQK8)8`N?M6rDh|yWRBJ`@!t8f zcQ}3#05F-AtWJ<6&#ziGdsl#F^jiT8owTz}tN;ui*=>LjZUR3XI7j@$JyOH-4d; zI1a@%my?;rRqsBmnrbKbZoGb--x7_Rexh}b`MHky5F#SKy#WUQ{9XCBqP=3DHIKj! z3f}pf3fP0?voL6U&ZnXZN2XgDf`|*ym*@?sbdtST9_Sw5;MLTR4&7NhT%S_aD%mxG z0e(Rg+7_IbXy6hR9r=W%#iN_AvD~Cq{gdvIHc_pK?COmP0QtVM*$vEKvGQZK@T)KR zN{LosAhyG(J+$7v#G?Fu$dA=t>AN_53o7Ham2AKMu1Q75wtb*-foM(+z%<&XRb%qg zj(_>XY6m4`i>oQLQW!VN0h_mE^mC);`ReFTIh@5mo`qAk{495^Yb2Dy3Pm(oUT&dU zke!lh^r0o~bRWcn;Y)3vHXLz}N-b$D@VgKSyn4FSc-Ei%`Q=c?QXgdQRcNb zE`&66OZr+2#;q7MEdEY~-cuFmC>=uqM_`OVdFTa9HV0oaz0_QZKB$Fg zh?y{8++4sGLK9pM89dh9`^Fhjh%)TmE-`_C+ht|GJqca14&8$>(NdWQvUw;SB@J|# zXB@DvOhAeoLLVJ_uRVl5dY+|V3)P6o$38F#|MqX++2j4C`XT6p2WpArjpIwWAyAus zkTGEaWb6@4-9Trzm!b zd>bW*l5btIKA_ph8lYW2yQDP6nhJM1M;qS!@a#j&HI~mjCa!T`sRU70Ll+^=0bBJ& zQgOEO^*P=Nn-`#L{wcTOMnfU#7jP=rb2zNQB)-MDnk{JVbs4}+4t`@<*y^wI1VfyJ z475-*T!dx{Xjm$S?vO**tcTlc`%D7pFm5FvfNl>*ocY-R7bdCc?2P4p44zIMQlH)b zYwz0sq0Ha@-R`ER13mj7#g?rGNk|TbqSltiF(e8zN?67rEG6TxDN3uuJuyP5 z6?;}4UjA5mA%;D<{PPbt40Bk68J|jDGWx4NbUscTy-oo2nWre1DeWI2lR58sLc&;$ zW=B~_Ei(ww=n00*#-2>@gaYN-oz$R!tz5&_CnJ}?Qv|KGa z`{-6}rWQmO7A_8pu@;;AZ%_wOAYq^4Sqn9KToj3#nv`}m4R=oE$C&sQKXqLwuB*|O zeLm2Xd3{NQ9@}_@jUHn$7Il>Y1OUGZIW=IW>RD&hdv<{1?P|Rc;2BCL76v&$K4sm9 zRbp1-aqL-gSrv=kJpe@M518u$V49ZN3W=?1mQ`oggm=89Z5|{58o;4ZQzPY-iX2Fu zWhcRHP?t>*-CeTqKZXrgANVLsW7tv%LaTNEH~Rna;aMLe_3g7S`cPPb`Z$|1Uo5$P zjW5Yauyli%395&Ty%Y$pY)p5OBfyyL2SfT3q8<!*&^^Cg|HL-7wy9>y2XJ|o0&ihh_w-)e z?(>W( zApuj`r+<5`5nT&{8@0aY0Mz(tuOM=fS_=CI3^RnzbS%n?zK(5vaaQqvZdYyc6!&hC z=$;n@l+^`j#|9!pK=Xh8=b{$Sy&QIA$X)v?7n7~7om}6$3iP{R6+rL~ z9ZZ>W80L`t2a0`&c(F)NOemWnH_`i}3V<0S#vKG@*A%(C04lcIEsX=T_W_3yr29er zObZZe?$y>Kx59@qj!17O%QC}Tju0+vlZU=6UDVrB8j478LmI8y^p13Kl{;h=$T3&s zQ%%%k)ca1s;kSDP_xFjZss~JmVXwpd@KK4?pk?s25Z@No47>X#IJtdK6;4ovRA=rsTbWUkW51dvSBclf+;aWE|!KgY%rKkWei9 zg*bZc$Q7StaQ9M=LQ_1CrbR!fAUpea@5<5$bXwQV1iklNP{U`vvf#qeWBQyUEs)QS zXiqyDJ9dL0v*>#xm$xi#@c=2>=4!+qbZ}j}p;QZO{=yuQT~$E|HLK`8VlcT*C{IxnS0%u8AW! z{XJGqM??vQQt-zT5d=QOlRf*+AFhM=KRveKf>%POMEwcKuaMCOe-FeRe5b(sC%)_$ zrXHi2%jvv8xylC!2pn?_akU$opWuLgOZ5PP%%60y*A)yb0F09wy`{hx&(Syo4)tU4@?dwOL0g!kE3VdwJ`7O_gjLtr_a$)1OKYY}pSy zPAOT6Z@*Pwn=}Hc4FG=wSv>l}ICAelZsnOOgcyG#*tXF$<^as=D9DmQi4ceq;prni z9xt@<^6=Ti%~N%Yz4t$#V{Se?ou9DG9w4rot*wmhCXjByYLRkLY7y?}eL{wm!_9!$ zw*!UXZ(Q31d3qT8a*XP3c!ke=%|AA<$OW#*5V3dTbbab^(p1Vw?At-u`>UhwngNf; zoYYp`0g zN>9fe)+d$ooK8nE&W$!#vlK6<7obhACpMkk5Y0%fdZ9@)J~mMi55UA6C-Z;^y}f$N zA90fjt$?IAyWtEuBD|0axzfv=&Lr`I-R2`VxLP?y>WeTe1mai>3kHx&hyR4)ZD@Dw zD+I*>Zs5L>0rQbrl4xJk0h$!ZtpU1fN>wtyJY57)%{)WE91ve>+-PIwqNTh*P+KlY zj0zh_Ws&$E0ILXwp2K|sjQP`|*i-jG1X_6SiVlquA6SX#i% zaFR#Nt^l%?hFcxDUmEDMwx$(1q7FtmEizJ{^;D`+}Fz9@ni(JKvt`MYB9T_3Y+Rj!-GRnsa1^f*AbLEPGmIKMori>J+$z;B?Eq1n*0>DZWB|7Hmc z+YP}n7WMdd|7Cttbxf5|PNxDW6bfPF)X|WaV6_@WrO@4%#JBy{JYc%F<<+0}-|xS5yO+34sNMBX|Gn zV#N0a&UVYNs2cEAv8c=O;2yqkV$3#H674NQ!WPaW;LBw!@kMzTWNTInC7jDLS7O+C zsDohGdU-8qFRd~coDGQWcN3YPXaeoH5z%YhF3yw`8sTMHwZNf3RRXKNg;e~jlaaC0 zugKSR2EjIu61EwM*qqtOZSLK*K?eaY4l;{W(uT$xL;H-kvClu1xAiXid}tXJq00IS zWg4ifrMJX#HNWI8v8b+Pb5i3sNg{Q&TI^3SVMD5TWeMVrCVy2cv%o5@*3Iep=g~zU z`Ey!o9BN!?0OHy>bjxj>gL|6W9C`Mvd7 zPYHJrLRt)Cc$uvd;H2Ybg31D7U=Y|UG3QCz#Z3TwrdmnpTTGZ<&R#-c?AaO$&4qF# zsIqEL%oN?vts?wPM9jlx0Ux~MsV_Sc9YXjV!sBQ_hqlpGS{~|$w<=9_8vOGM4sig9 zdPnLRzt2TxQEU=&{ruz7Qc5llSH4{n67p5z^qf`OnUs`hT^LMei($lcEGR9!^6-y~ zT<2@@Zp=+ld|!l-mvUDqkr|@ozqj_QL~CzWAqcuzMOdL45rHe31$wX3J<*?b)h&es z*8H|@xzd1xL|WAp?0qHjmUbX-$$3naIq8|qzhEigy^%HfGQy~JIAfbW`x;L7xG%nd zGUR~rB*!u*d)FE>`Ge%S!z;eoI$f2L#5Z-I9ly_|zJ@^%gaU@aAsFVZx6f@jDHdXr zD&*KBC1N4t&Y=>H#ZCmRI*w#b@5KXp;3I7f6 zaL(s)Hh04hgki1*h=o!h#cLSq!#mxWU@!Ca0NbEr!uRn+p#)W!F;CAVf}Wfsvz$&V zXiFVn(C>-;QZYHRWDo+u>L=fE>u@oNC`i{!W?D-6^{A684cVV+z9G?xjBVk?5~BRX zRY+h6R09@;Lv5t(g+94*E8AGc=BpCwPU!lZ%QMW1nSU5*2HONCJnT-6*vKAI*4H_R zTz@3x@eXm(M-fJXGt7C`SBUSpG)_sqaX+|=ZIMV%R63JD7?6l z5MLkUA1LKO0fAwM(>)E|O6Qw=v%XVYq&aj2Q>ah=WD)`Kq*^+0S0T^?p$Ja6#j`P9D-88&Eyi;sGZu*t4V2s|wxd@V@clJq$_ zL_}T>nKoekQW@wk8S$=9wVxJm|0H7Oqz`GZBNnuA@niASiV)(w*W3tWrst>n!V2&u zYswC3*BDXJmW+{&b#z~wx>afFGbs{KJDsOLI?Ls-7MqW>ad{`~K50`3&+h}Ybz#^> z`<|KpdQZj&PrS{Lty20{6@K1iA+U3nPj_M$gFKkPuOu5e3B(%;MHgJlQF#339#?dU zzk+;yZb}4+X_JE!PVk9yX0P%-%+)i>v*&3#iX0``oKmfa1BsE!?C%@-QeJ@{ws=Dz zL5#N}Xu1KI7Mf^llp0Q;AOKn}!8BD{08xcK%_>vYIP;Dnd52KFrvb#DC>A z1kDzW4poGVJx@U<+|MJ2b!~1`mb~UVAEJN@q1+>rV&~;y#)&X|$V?EHTSn<0RU%la z4v^p&b|xA0qRNmNz>Qq-rC*)60P}#ufaDOoC0nV5L#q_1=|Chlf2;t^0s9@v+A{Dp z$=auBlK1M3wL}gpqE>IP`P^I@_ooP+x0T!sod^f21?Zh!E0UoN$6CV=UzAbd*_yk; zaIHZDlsM0sjojg;3df;urE(g{zBqjNPog*X!1)Q~G8h1nC0x?zZXx~xMYTPFe<8PQ zx_$oOo6x~6pmIELC^eO@M~0kAtmh8#@{7$z-f>gQE%9b<5n5iH8h}}cl{9GE8O7Vy zu?v-^Ci9db&tmMZkR=0AVlLUQGMN!;PDS>t`bVUG7v!+wX#qd888|%%@30t%hdewS z*h&@V9bDqJg$3fdG)M6ZuMm?T1*UH5iX&Y#5B!CfSzi{k0m;84H7qM^O-k^UtpF8D#mGr4`gxtP0JYykkW<3P}-tGQ(fT^{sE^Po?5 zc^&c)sl6jM8s!VIR$Ki$k|tRoBv-1jM;psn+CJi!AKL!pSf9{Jn)-vJ=~AB|W8D2n z)6y=lfp}X9y`8@Qs(f2rD`VCN_unfpCBIP1KyHMdh3X5J`gnhM{kTsh;h@?1bjxo9 zaT~owa9!Shkmx!UeEUXrbCz)Wl|xpLfzN%!s?Za+tvvbr35(X1bdL80pNC)uM-8V{ ziFbowmJbxj`>M1aveM$;?c)_HLNisNxnMLmP5LP!am8S%jG~nwkK3T1o}WGfzEnxT zVwwNIqNY%?X?IGv_c6^La5PCtbCAhKTiNnv zf28+@=G#c@{tk21M_i?~;&>s;h_1mtmz$<(7C1vPP6UhXch6~o&LYG9;8I(_Dj9>< zjoabQ`kxFo2K*YX8NUm|wgDs`qG;$yUS434VrJ+yE)oSLx9PH1Gw4*jZ=g^El&N`u zJHAy#Umpgil|MSGyT2=YnnJs>>oV+H8EJWlQx?>n!kxYcBHZhdbUN?oB?%(aB@b!o5l@+igAWL}tTgg>shH?Wn| z!JUJov##>%403xSU)?L^4;UcvNYJ$JT>7Eg;tlL16txFbET7*S94^$f6!dbfac31T zzsoQ`qfME8oK$Adn~~Qj^l6^0Q)8rF=C3BVU*~g3Ft{OmGI)R2*=Y(&d5I4qO9Whh z5fe4c0;hX>a!g$=zTL!DhsFW_%IS`d?Mzy6y7%v!*|ClM3NM8yPg1BgK2bR5w1bxY zw~czEZtab|7 Date: Wed, 10 Jan 2024 16:02:24 +0100 Subject: [PATCH 011/267] Move from antlr4ts to ANTLR's official TypeScript target (#184) --- .eslintrc.cjs | 2 +- DEVELOPMENT.md | 27 + packages/cashc/package.json | 5 +- packages/cashc/src/ast/AstBuilder.ts | 100 +- packages/cashc/src/ast/Location.ts | 11 +- packages/cashc/src/ast/Pragma.ts | 4 +- .../cashc/src/ast/ThrowingErrorListener.ts | 10 +- packages/cashc/src/compiler.ts | 8 +- packages/cashc/src/grammar/CashScript.interp | 2 +- .../cashc/src/grammar/CashScriptLexer.interp | 2 +- packages/cashc/src/grammar/CashScriptLexer.ts | 823 ++++--- .../cashc/src/grammar/CashScriptParser.ts | 1921 ++++++++--------- .../cashc/src/grammar/CashScriptVisitor.ts | 279 +-- packages/cashc/test/ast/Location.test.ts | 17 + yarn.lock | 13 +- 15 files changed, 1556 insertions(+), 1668 deletions(-) create mode 100644 DEVELOPMENT.md diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 3ee079db..cda597db 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -18,7 +18,7 @@ module.exports = { 'max-len': ['error', { code: 120, ignoreStrings: true, ignoreTemplateLiterals: true }], 'import/no-cycle': 0, // Needed for AST -> AstVisitor -> AST 'class-methods-use-this': 0, // I don't like this rule - 'no-underscore-dangle': 0, // antlr4ts automatically uses this + 'no-underscore-dangle': 0, // antlr automatically uses this 'no-param-reassign': 0, // Makes visitors returning the node object easier '@typescript-eslint/lines-between-class-members': [ // Makes defining interfaces / abstract classes easier 'error', diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 00000000..d40018f4 --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,27 @@ +## cashc + +### Prerequisites + +In order to use the `antlr` command line tool when updating CashScript's grammar file, you need to have it installed. + +On macOS you can install it using Homebrew: + +```bash +brew install antlr +``` + +On Linux you can install it using apt: + +```bash +sudo apt install antlr4 +``` + +For other platforms, refer to the [Antlr website](https://www.antlr.org/). + +### Updating the grammar + +When updating the grammar file in `src/grammar/CashScript.g4`, we also need to make sure that the generated parser is updated. To do this, run the following command in the `packages/cashc` directory: + +```bash +yarn antlr +`````` diff --git a/packages/cashc/package.json b/packages/cashc/package.json index 80c4d410..207c5ed5 100644 --- a/packages/cashc/package.json +++ b/packages/cashc/package.json @@ -34,7 +34,7 @@ "test": "test" }, "scripts": { - "antlr": "antlr4ts -visitor -no-listener src/grammar/CashScript.g4", + "antlr": "antlr -Dlanguage=TypeScript -visitor -no-listener src/grammar/CashScript.g4", "postantlr": "find src/grammar -type f -name '*.ts' | xargs sed -i '' 's|\\(import .* \".*/.*\\)\";|\\1\\.js\";|g'", "build": "yarn clean && yarn compile", "build:test": "yarn clean:test && yarn compile:test && cpy './test/**/*.cash' ./dist-test/test", @@ -51,7 +51,7 @@ "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", "@cashscript/utils": "^0.9.2", - "antlr4ts": "^0.5.0-alpha.4", + "antlr4": "^4.13.1-patch-1", "commander": "^7.1.0", "semver": "^7.3.4" }, @@ -59,7 +59,6 @@ "@jest/globals": "^29.4.1", "@types/node": "^18.11.18", "@types/semver": "^7.3.4", - "antlr4ts-cli": "^0.5.0-alpha.4", "cpy-cli": "^4.2.0", "eslint": "^7.20.0", "jest": "^29.4.1", diff --git a/packages/cashc/src/ast/AstBuilder.ts b/packages/cashc/src/ast/AstBuilder.ts index dc435a0f..af08961d 100644 --- a/packages/cashc/src/ast/AstBuilder.ts +++ b/packages/cashc/src/ast/AstBuilder.ts @@ -1,8 +1,6 @@ +import { ParseTree, ParseTreeVisitor } from 'antlr4'; import { hexToBin } from '@bitauth/libauth'; import { parseType } from '@cashscript/utils'; -import { AbstractParseTreeVisitor } from 'antlr4ts/tree/AbstractParseTreeVisitor.js'; -import { ParseTree } from 'antlr4ts/tree/ParseTree.js'; -import { TerminalNode } from 'antlr4ts/tree/TerminalNode.js'; import semver from 'semver'; import { Node, @@ -46,7 +44,6 @@ import type { FunctionCallContext, CastContext, LiteralContext, - NumberLiteralContext, SourceFileContext, BlockContext, TimeOpStatementContext, @@ -63,8 +60,9 @@ import type { InstantiationContext, NullaryOpContext, UnaryIntrospectionOpContext, + StatementContext, } from '../grammar/CashScriptParser.js'; -import type { CashScriptVisitor } from '../grammar/CashScriptVisitor.js'; +import CashScriptVisitor from '../grammar/CashScriptVisitor.js'; import { Location } from './Location.js'; import { NumberUnit, @@ -75,7 +73,7 @@ import { version } from '../index.js'; import { ParseError, VersionError } from '../Errors.js'; export default class AstBuilder - extends AbstractParseTreeVisitor + extends ParseTreeVisitor implements CashScriptVisitor { constructor(private tree: ParseTree) { super(); @@ -90,7 +88,7 @@ export default class AstBuilder } visitSourceFile(ctx: SourceFileContext): SourceFileNode { - ctx.pragmaDirective().forEach((pragma) => { + ctx.pragmaDirective_list().forEach((pragma) => { this.processPragma(pragma); }); @@ -101,15 +99,15 @@ export default class AstBuilder } processPragma(ctx: PragmaDirectiveContext): void { - const pragmaName = getPragmaName(ctx.pragmaName().text); + const pragmaName = getPragmaName(ctx.pragmaName().getText()); if (pragmaName !== PragmaName.CASHSCRIPT) throw new Error(); // Shouldn't happen // Strip any -beta tags const actualVersion = version.replace(/-.*/g, ''); - ctx.pragmaValue().versionConstraint().forEach((constraint) => { + ctx.pragmaValue().versionConstraint_list().forEach((constraint) => { const op = getVersionOpFromCtx(constraint.versionOperator()); - const versionConstraint = `${op}${constraint.VersionLiteral().text}`; + const versionConstraint = `${op}${constraint.VersionLiteral().getText()}`; if (!semver.satisfies(actualVersion, versionConstraint)) { throw new VersionError(actualVersion, versionConstraint); } @@ -117,18 +115,18 @@ export default class AstBuilder } visitContractDefinition(ctx: ContractDefinitionContext): ContractNode { - const name = ctx.Identifier().text; - const parameters = ctx.parameterList().parameter().map((p) => this.visit(p) as ParameterNode); - const functions = ctx.functionDefinition().map((f) => this.visit(f) as FunctionDefinitionNode); + const name = ctx.Identifier().getText(); + const parameters = ctx.parameterList().parameter_list().map((p) => this.visit(p) as ParameterNode); + const functions = ctx.functionDefinition_list().map((f) => this.visit(f) as FunctionDefinitionNode); const contract = new ContractNode(name, parameters, functions); contract.location = Location.fromCtx(ctx); return contract; } visitFunctionDefinition(ctx: FunctionDefinitionContext): FunctionDefinitionNode { - const name = ctx.Identifier().text; - const parameters = ctx.parameterList().parameter().map((p) => this.visit(p) as ParameterNode); - const statements = ctx.statement().map((s) => this.visit(s) as StatementNode); + const name = ctx.Identifier().getText(); + const parameters = ctx.parameterList().parameter_list().map((p) => this.visit(p) as ParameterNode); + const statements = ctx.statement_list().map((s) => this.visit(s) as StatementNode); const block = new BlockNode(statements); block.location = Location.fromCtx(ctx); @@ -138,17 +136,22 @@ export default class AstBuilder } visitParameter(ctx: ParameterContext): ParameterNode { - const type = parseType(ctx.typeName().text); - const name = ctx.Identifier().text; + const type = parseType(ctx.typeName().getText()); + const name = ctx.Identifier().getText(); const parameter = new ParameterNode(type, name); parameter.location = Location.fromCtx(ctx); return parameter; } + visitStatement(ctx: StatementContext): StatementNode { + // Statement nodes only have a single child, so we can just visit that child + return this.visit(ctx.getChild(0)); + } + visitVariableDefinition(ctx: VariableDefinitionContext): VariableDefinitionNode { - const type = parseType(ctx.typeName().text); - const modifiers = ctx.modifier().map((modifier) => modifier.text); - const name = ctx.Identifier().text; + const type = parseType(ctx.typeName().getText()); + const modifiers = ctx.modifier_list().map((modifier) => modifier.getText()); + const name = ctx.Identifier().getText(); const expression = this.visit(ctx.expression()); const variableDefinition = new VariableDefinitionNode(type, modifiers, name, expression); variableDefinition.location = Location.fromCtx(ctx); @@ -157,18 +160,19 @@ export default class AstBuilder visitTupleAssignment(ctx: TupleAssignmentContext): TupleAssignmentNode { const expression = this.visit(ctx.expression()); - const names = ctx.Identifier(); - const types = ctx.typeName(); - const [var1, var2] = names.map((name, i) => ( - { name: name.text, type: parseType(types[i].text) } - )); + const names = ctx.Identifier_list(); + const types = ctx.typeName_list(); + const [var1, var2] = names.map((name, i) => ({ + name: name.getText(), + type: parseType(types[i].getText()), + })); const tupleAssignment = new TupleAssignmentNode(var1, var2, expression); tupleAssignment.location = Location.fromCtx(ctx); return tupleAssignment; } visitAssignStatement(ctx: AssignStatementContext): AssignNode { - const identifier = new IdentifierNode(ctx.Identifier().text); + const identifier = new IdentifierNode(ctx.Identifier().getText()); identifier.location = Location.fromToken(ctx.Identifier().symbol); const expression = this.visit(ctx.expression()); @@ -179,7 +183,7 @@ export default class AstBuilder visitTimeOpStatement(ctx: TimeOpStatementContext): TimeOpNode { const expression = this.visit(ctx.expression()); - const timeOp = new TimeOpNode(ctx.TxVar().text as TimeOp, expression); + const timeOp = new TimeOpNode(ctx.TxVar().getText() as TimeOp, expression); timeOp.location = Location.fromCtx(ctx); return timeOp; @@ -202,7 +206,7 @@ export default class AstBuilder } visitBlock(ctx: BlockContext): BlockNode { - const statements = ctx.statement().map((s) => this.visit(s) as StatementNode); + const statements = ctx.statement_list().map((s) => this.visit(s) as StatementNode); const block = new BlockNode(statements); block.location = Location.fromCtx(ctx); return block; @@ -213,7 +217,7 @@ export default class AstBuilder } visitCast(ctx: CastContext): CastNode { - const type = parseType(ctx.typeName().text); + const type = parseType(ctx.typeName().getText()); const expression = this.visit(ctx._castable); const size = ctx._size && this.visit(ctx._size); const cast = new CastNode(type, expression, size); @@ -226,18 +230,18 @@ export default class AstBuilder } visitFunctionCall(ctx: FunctionCallContext): FunctionCallNode { - const identifier = new IdentifierNode(ctx.Identifier().text as string); + const identifier = new IdentifierNode(ctx.Identifier().getText()); identifier.location = Location.fromToken(ctx.Identifier().symbol); - const parameters = ctx.expressionList().expression().map((e) => this.visit(e)); + const parameters = ctx.expressionList().expression_list().map((e) => this.visit(e)); const functionCall = new FunctionCallNode(identifier, parameters); functionCall.location = Location.fromCtx(ctx); return functionCall; } visitInstantiation(ctx: InstantiationContext): InstantiationNode { - const identifier = new IdentifierNode(ctx.Identifier().text as string); + const identifier = new IdentifierNode(ctx.Identifier().getText()); identifier.location = Location.fromToken(ctx.Identifier().symbol); - const parameters = ctx.expressionList().expression().map((e) => this.visit(e)); + const parameters = ctx.expressionList().expression_list().map((e) => this.visit(e)); const instantiation = new InstantiationNode(identifier, parameters); instantiation.location = Location.fromCtx(ctx); return instantiation; @@ -245,14 +249,14 @@ export default class AstBuilder visitTupleIndexOp(ctx: TupleIndexOpContext): TupleIndexOpNode { const tuple = this.visit(ctx.expression()); - const index = parseInt(ctx._index.text as string, 10); + const index = parseInt(ctx._index.text, 10); const tupleIndexOp = new TupleIndexOpNode(tuple, index); tupleIndexOp.location = Location.fromCtx(ctx); return tupleIndexOp; } visitNullaryOp(ctx: NullaryOpContext): NullaryOpNode { - const operator = ctx.text as NullaryOperator; + const operator = ctx.getText() as NullaryOperator; const nullaryOp = new NullaryOpNode(operator); nullaryOp.location = Location.fromCtx(ctx); return nullaryOp; @@ -284,14 +288,14 @@ export default class AstBuilder } visitArray(ctx: ArrayContext): ArrayNode { - const elements = ctx.expression().map((e) => this.visit(e)); + const elements = ctx.expression_list().map((e) => this.visit(e)); const array = new ArrayNode(elements); array.location = Location.fromCtx(ctx); return array; } visitIdentifier(ctx: IdentifierContext): IdentifierNode { - const identifier = new IdentifierNode((ctx.Identifier() as TerminalNode).text); + const identifier = new IdentifierNode(ctx.Identifier().getText()); identifier.location = Location.fromCtx(ctx); return identifier; } @@ -325,7 +329,7 @@ export default class AstBuilder } createBooleanLiteral(ctx: LiteralContext): BoolLiteralNode { - const boolString = (ctx.BooleanLiteral() as TerminalNode).text; + const boolString = ctx.BooleanLiteral().getText(); const boolValue = boolString === 'true'; const booleanLiteral = new BoolLiteralNode(boolValue); booleanLiteral.location = Location.fromCtx(ctx); @@ -333,9 +337,9 @@ export default class AstBuilder } createIntLiteral(ctx: LiteralContext): IntLiteralNode { - const numberCtx = ctx.numberLiteral() as NumberLiteralContext; - const numberString = numberCtx.NumberLiteral().text; - const numberUnit = numberCtx.NumberUnit()?.text; + const numberCtx = ctx.numberLiteral(); + const numberString = numberCtx.NumberLiteral().getText(); + const numberUnit = numberCtx.NumberUnit()?.getText(); const numberValue = BigInt(numberString) * BigInt(numberUnit ? NumberUnit[numberUnit.toUpperCase()] : 1); const intLiteral = new IntLiteralNode(numberValue); intLiteral.location = Location.fromCtx(ctx); @@ -343,7 +347,7 @@ export default class AstBuilder } createStringLiteral(ctx: LiteralContext): StringLiteralNode { - const rawString = (ctx.StringLiteral() as TerminalNode).text; + const rawString = ctx.StringLiteral().getText(); const stringValue = rawString.substring(1, rawString.length - 1); const quote = rawString.substring(0, 1); const stringLiteral = new StringLiteralNode(stringValue, quote); @@ -352,7 +356,7 @@ export default class AstBuilder } createDateLiteral(ctx: LiteralContext): IntLiteralNode { - const rawString = (ctx.DateLiteral() as TerminalNode).text; + const rawString = ctx.DateLiteral().getText(); const stringValue = rawString.substring(6, rawString.length - 2).trim(); if (!/^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d$/.test(stringValue)) { @@ -371,10 +375,16 @@ export default class AstBuilder } createHexLiteral(ctx: LiteralContext): HexLiteralNode { - const hexString = (ctx.HexLiteral() as TerminalNode).text; + const hexString = ctx.HexLiteral().getText(); const hexValue = hexToBin(hexString.substring(2)); const hexLiteral = new HexLiteralNode(hexValue); hexLiteral.location = Location.fromCtx(ctx); return hexLiteral; } + + // For safety reasons, we throw an error when the "default" visitChildren is called. *All* nodes + // must have a custom visit method, so that we can be sure that we've covered all cases. + visitChildren(): Node { + throw new Error('Safety Warning: Unhandled node in AST builder'); + } } diff --git a/packages/cashc/src/ast/Location.ts b/packages/cashc/src/ast/Location.ts index 93109ea0..c1e59eaf 100644 --- a/packages/cashc/src/ast/Location.ts +++ b/packages/cashc/src/ast/Location.ts @@ -1,5 +1,4 @@ -import type { ParserRuleContext } from 'antlr4ts/ParserRuleContext.js'; -import type { Token } from 'antlr4ts'; +import type { ParserRuleContext, Token } from 'antlr4'; export class Location { constructor(public start: Point, public end: Point) {} @@ -8,8 +7,8 @@ export class Location { const stop = ctx.stop?.text ? ctx.stop : ctx.start; const textLength = (stop.text ?? '').length; - const start = new Point(ctx.start.line, ctx.start.charPositionInLine); - const end = new Point(stop.line, stop.charPositionInLine + textLength); + const start = new Point(ctx.start.line, ctx.start.column); + const end = new Point(stop.line, stop.column + textLength); return new Location(start, end); } @@ -17,8 +16,8 @@ export class Location { static fromToken(token: Token): Location | undefined { const textLength = (token.text ?? '').length; - const start = new Point(token.line, token.charPositionInLine); - const end = new Point(token.line, token.charPositionInLine + textLength); + const start = new Point(token.line, token.column); + const end = new Point(token.line, token.column + textLength); return new Location(start, end); } diff --git a/packages/cashc/src/ast/Pragma.ts b/packages/cashc/src/ast/Pragma.ts index 2b67694c..be0c9b19 100644 --- a/packages/cashc/src/ast/Pragma.ts +++ b/packages/cashc/src/ast/Pragma.ts @@ -1,4 +1,4 @@ -import { VersionOperatorContext } from '../grammar/CashScriptParser.js'; +import type { VersionOperatorContext } from '../grammar/CashScriptParser.js'; export enum PragmaName { CASHSCRIPT = 'cashscript', @@ -19,5 +19,5 @@ export function getPragmaName(name: string): PragmaName { } export function getVersionOpFromCtx(ctx?: VersionOperatorContext): VersionOp { - return (ctx ? ctx.text : '='); + return (ctx ? ctx.getText() : '='); } diff --git a/packages/cashc/src/ast/ThrowingErrorListener.ts b/packages/cashc/src/ast/ThrowingErrorListener.ts index dafe6530..9d07f81a 100644 --- a/packages/cashc/src/ast/ThrowingErrorListener.ts +++ b/packages/cashc/src/ast/ThrowingErrorListener.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { ANTLRErrorListener, RecognitionException, Recognizer } from 'antlr4ts'; +import { ErrorListener, RecognitionException, Recognizer } from 'antlr4'; import { ParseError } from '../Errors.js'; import { Point } from './Location.js'; @@ -7,12 +7,12 @@ import { Point } from './Location.js'; * ANTLR Error Listener that immediately throws on error. This is used so that * ANTLR doesn't attempt any error recovery during lexing/parsing and fails early. */ -export default class ThrowingErrorListener implements ANTLRErrorListener { +export default class ThrowingErrorListener extends ErrorListener { static readonly INSTANCE = new ThrowingErrorListener(); - syntaxError( - recognizer: Recognizer, - offendingSymbol: T, + syntaxError( + recognizer: Recognizer, + offendingSymbol: TSymbol, line: number, charPositionInLine: number, message: string, diff --git a/packages/cashc/src/compiler.ts b/packages/cashc/src/compiler.ts index e5779275..5f4d56d7 100644 --- a/packages/cashc/src/compiler.ts +++ b/packages/cashc/src/compiler.ts @@ -1,13 +1,13 @@ +import { CharStream, CommonTokenStream } from 'antlr4'; import { Artifact, optimiseBytecode } from '@cashscript/utils'; -import { ANTLRInputStream, CommonTokenStream } from 'antlr4ts'; import fs, { PathLike } from 'fs'; import { generateArtifact } from './artifact/Artifact.js'; import { Ast } from './ast/AST.js'; import AstBuilder from './ast/AstBuilder.js'; import ThrowingErrorListener from './ast/ThrowingErrorListener.js'; import GenerateTargetTraversal from './generation/GenerateTargetTraversal.js'; -import { CashScriptLexer } from './grammar/CashScriptLexer.js'; -import { CashScriptParser } from './grammar/CashScriptParser.js'; +import CashScriptLexer from './grammar/CashScriptLexer.js'; +import CashScriptParser from './grammar/CashScriptParser.js'; import SymbolTableTraversal from './semantic/SymbolTableTraversal.js'; import TypeCheckTraversal from './semantic/TypeCheckTraversal.js'; import EnsureFinalRequireTraversal from './semantic/EnsureFinalRequireTraversal.js'; @@ -39,7 +39,7 @@ export function compileFile(codeFile: PathLike): Artifact { export function parseCode(code: string): Ast { // Lexing (throwing on errors) - const inputStream = new ANTLRInputStream(code); + const inputStream = new CharStream(code); const lexer = new CashScriptLexer(inputStream); lexer.removeErrorListeners(); lexer.addErrorListener(ThrowingErrorListener.INSTANCE); diff --git a/packages/cashc/src/grammar/CashScript.interp b/packages/cashc/src/grammar/CashScript.interp index ae258f62..46ee4da6 100644 --- a/packages/cashc/src/grammar/CashScript.interp +++ b/packages/cashc/src/grammar/CashScript.interp @@ -175,4 +175,4 @@ typeName atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 73, 324, 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, 3, 2, 7, 2, 54, 10, 2, 12, 2, 14, 2, 57, 11, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 5, 5, 71, 10, 5, 3, 6, 5, 6, 74, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 7, 8, 85, 10, 8, 12, 8, 14, 8, 88, 11, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 97, 10, 9, 12, 9, 14, 9, 100, 11, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 108, 10, 10, 12, 10, 14, 10, 111, 11, 10, 3, 10, 5, 10, 114, 10, 10, 5, 10, 116, 10, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 7, 12, 125, 10, 12, 12, 12, 14, 12, 128, 11, 12, 3, 12, 3, 12, 5, 12, 132, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 140, 10, 13, 3, 14, 3, 14, 7, 14, 144, 10, 14, 12, 14, 14, 14, 147, 11, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 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, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 189, 10, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 198, 10, 21, 12, 21, 14, 21, 201, 11, 21, 3, 21, 5, 21, 204, 10, 21, 5, 21, 206, 10, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 220, 10, 22, 3, 22, 5, 22, 223, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 249, 10, 22, 12, 22, 14, 22, 252, 11, 22, 3, 22, 5, 22, 255, 10, 22, 5, 22, 257, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 263, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 304, 10, 22, 12, 22, 14, 22, 307, 11, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 316, 10, 24, 3, 25, 3, 25, 5, 25, 320, 10, 25, 3, 26, 3, 26, 3, 26, 2, 2, 3, 42, 27, 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, 2, 12, 3, 2, 6, 12, 3, 2, 27, 31, 4, 2, 27, 31, 33, 36, 3, 2, 40, 41, 3, 2, 42, 44, 4, 2, 41, 41, 45, 45, 3, 2, 8, 11, 3, 2, 46, 47, 3, 2, 37, 38, 4, 2, 53, 58, 63, 63, 2, 350, 2, 55, 3, 2, 2, 2, 4, 61, 3, 2, 2, 2, 6, 66, 3, 2, 2, 2, 8, 68, 3, 2, 2, 2, 10, 73, 3, 2, 2, 2, 12, 77, 3, 2, 2, 2, 14, 79, 3, 2, 2, 2, 16, 91, 3, 2, 2, 2, 18, 103, 3, 2, 2, 2, 20, 119, 3, 2, 2, 2, 22, 131, 3, 2, 2, 2, 24, 139, 3, 2, 2, 2, 26, 141, 3, 2, 2, 2, 28, 153, 3, 2, 2, 2, 30, 162, 3, 2, 2, 2, 32, 167, 3, 2, 2, 2, 34, 175, 3, 2, 2, 2, 36, 181, 3, 2, 2, 2, 38, 190, 3, 2, 2, 2, 40, 193, 3, 2, 2, 2, 42, 262, 3, 2, 2, 2, 44, 308, 3, 2, 2, 2, 46, 315, 3, 2, 2, 2, 48, 317, 3, 2, 2, 2, 50, 321, 3, 2, 2, 2, 52, 54, 5, 4, 3, 2, 53, 52, 3, 2, 2, 2, 54, 57, 3, 2, 2, 2, 55, 53, 3, 2, 2, 2, 55, 56, 3, 2, 2, 2, 56, 58, 3, 2, 2, 2, 57, 55, 3, 2, 2, 2, 58, 59, 5, 14, 8, 2, 59, 60, 7, 2, 2, 3, 60, 3, 3, 2, 2, 2, 61, 62, 7, 3, 2, 2, 62, 63, 5, 6, 4, 2, 63, 64, 5, 8, 5, 2, 64, 65, 7, 4, 2, 2, 65, 5, 3, 2, 2, 2, 66, 67, 7, 5, 2, 2, 67, 7, 3, 2, 2, 2, 68, 70, 5, 10, 6, 2, 69, 71, 5, 10, 6, 2, 70, 69, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 9, 3, 2, 2, 2, 72, 74, 5, 12, 7, 2, 73, 72, 3, 2, 2, 2, 73, 74, 3, 2, 2, 2, 74, 75, 3, 2, 2, 2, 75, 76, 7, 59, 2, 2, 76, 11, 3, 2, 2, 2, 77, 78, 9, 2, 2, 2, 78, 13, 3, 2, 2, 2, 79, 80, 7, 13, 2, 2, 80, 81, 7, 70, 2, 2, 81, 82, 5, 18, 10, 2, 82, 86, 7, 14, 2, 2, 83, 85, 5, 16, 9, 2, 84, 83, 3, 2, 2, 2, 85, 88, 3, 2, 2, 2, 86, 84, 3, 2, 2, 2, 86, 87, 3, 2, 2, 2, 87, 89, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 89, 90, 7, 15, 2, 2, 90, 15, 3, 2, 2, 2, 91, 92, 7, 16, 2, 2, 92, 93, 7, 70, 2, 2, 93, 94, 5, 18, 10, 2, 94, 98, 7, 14, 2, 2, 95, 97, 5, 24, 13, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 101, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 15, 2, 2, 102, 17, 3, 2, 2, 2, 103, 115, 7, 17, 2, 2, 104, 109, 5, 20, 11, 2, 105, 106, 7, 18, 2, 2, 106, 108, 5, 20, 11, 2, 107, 105, 3, 2, 2, 2, 108, 111, 3, 2, 2, 2, 109, 107, 3, 2, 2, 2, 109, 110, 3, 2, 2, 2, 110, 113, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 112, 114, 7, 18, 2, 2, 113, 112, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 116, 3, 2, 2, 2, 115, 104, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 117, 3, 2, 2, 2, 117, 118, 7, 19, 2, 2, 118, 19, 3, 2, 2, 2, 119, 120, 5, 50, 26, 2, 120, 121, 7, 70, 2, 2, 121, 21, 3, 2, 2, 2, 122, 126, 7, 14, 2, 2, 123, 125, 5, 24, 13, 2, 124, 123, 3, 2, 2, 2, 125, 128, 3, 2, 2, 2, 126, 124, 3, 2, 2, 2, 126, 127, 3, 2, 2, 2, 127, 129, 3, 2, 2, 2, 128, 126, 3, 2, 2, 2, 129, 132, 7, 15, 2, 2, 130, 132, 5, 24, 13, 2, 131, 122, 3, 2, 2, 2, 131, 130, 3, 2, 2, 2, 132, 23, 3, 2, 2, 2, 133, 140, 5, 26, 14, 2, 134, 140, 5, 28, 15, 2, 135, 140, 5, 30, 16, 2, 136, 140, 5, 32, 17, 2, 137, 140, 5, 34, 18, 2, 138, 140, 5, 36, 19, 2, 139, 133, 3, 2, 2, 2, 139, 134, 3, 2, 2, 2, 139, 135, 3, 2, 2, 2, 139, 136, 3, 2, 2, 2, 139, 137, 3, 2, 2, 2, 139, 138, 3, 2, 2, 2, 140, 25, 3, 2, 2, 2, 141, 145, 5, 50, 26, 2, 142, 144, 5, 44, 23, 2, 143, 142, 3, 2, 2, 2, 144, 147, 3, 2, 2, 2, 145, 143, 3, 2, 2, 2, 145, 146, 3, 2, 2, 2, 146, 148, 3, 2, 2, 2, 147, 145, 3, 2, 2, 2, 148, 149, 7, 70, 2, 2, 149, 150, 7, 12, 2, 2, 150, 151, 5, 42, 22, 2, 151, 152, 7, 4, 2, 2, 152, 27, 3, 2, 2, 2, 153, 154, 5, 50, 26, 2, 154, 155, 7, 70, 2, 2, 155, 156, 7, 18, 2, 2, 156, 157, 5, 50, 26, 2, 157, 158, 7, 70, 2, 2, 158, 159, 7, 12, 2, 2, 159, 160, 5, 42, 22, 2, 160, 161, 7, 4, 2, 2, 161, 29, 3, 2, 2, 2, 162, 163, 7, 70, 2, 2, 163, 164, 7, 12, 2, 2, 164, 165, 5, 42, 22, 2, 165, 166, 7, 4, 2, 2, 166, 31, 3, 2, 2, 2, 167, 168, 7, 20, 2, 2, 168, 169, 7, 17, 2, 2, 169, 170, 7, 68, 2, 2, 170, 171, 7, 8, 2, 2, 171, 172, 5, 42, 22, 2, 172, 173, 7, 19, 2, 2, 173, 174, 7, 4, 2, 2, 174, 33, 3, 2, 2, 2, 175, 176, 7, 20, 2, 2, 176, 177, 7, 17, 2, 2, 177, 178, 5, 42, 22, 2, 178, 179, 7, 19, 2, 2, 179, 180, 7, 4, 2, 2, 180, 35, 3, 2, 2, 2, 181, 182, 7, 21, 2, 2, 182, 183, 7, 17, 2, 2, 183, 184, 5, 42, 22, 2, 184, 185, 7, 19, 2, 2, 185, 188, 5, 22, 12, 2, 186, 187, 7, 22, 2, 2, 187, 189, 5, 22, 12, 2, 188, 186, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 37, 3, 2, 2, 2, 190, 191, 7, 70, 2, 2, 191, 192, 5, 40, 21, 2, 192, 39, 3, 2, 2, 2, 193, 205, 7, 17, 2, 2, 194, 199, 5, 42, 22, 2, 195, 196, 7, 18, 2, 2, 196, 198, 5, 42, 22, 2, 197, 195, 3, 2, 2, 2, 198, 201, 3, 2, 2, 2, 199, 197, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 202, 204, 7, 18, 2, 2, 203, 202, 3, 2, 2, 2, 203, 204, 3, 2, 2, 2, 204, 206, 3, 2, 2, 2, 205, 194, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 208, 7, 19, 2, 2, 208, 41, 3, 2, 2, 2, 209, 210, 8, 22, 1, 2, 210, 211, 7, 17, 2, 2, 211, 212, 5, 42, 22, 2, 212, 213, 7, 19, 2, 2, 213, 263, 3, 2, 2, 2, 214, 215, 5, 50, 26, 2, 215, 216, 7, 17, 2, 2, 216, 219, 5, 42, 22, 2, 217, 218, 7, 18, 2, 2, 218, 220, 5, 42, 22, 2, 219, 217, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 222, 3, 2, 2, 2, 221, 223, 7, 18, 2, 2, 222, 221, 3, 2, 2, 2, 222, 223, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 7, 19, 2, 2, 225, 263, 3, 2, 2, 2, 226, 263, 5, 38, 20, 2, 227, 228, 7, 23, 2, 2, 228, 229, 7, 70, 2, 2, 229, 263, 5, 40, 21, 2, 230, 231, 7, 26, 2, 2, 231, 232, 7, 24, 2, 2, 232, 233, 5, 42, 22, 2, 233, 234, 7, 25, 2, 2, 234, 235, 9, 3, 2, 2, 235, 263, 3, 2, 2, 2, 236, 237, 7, 32, 2, 2, 237, 238, 7, 24, 2, 2, 238, 239, 5, 42, 22, 2, 239, 240, 7, 25, 2, 2, 240, 241, 9, 4, 2, 2, 241, 263, 3, 2, 2, 2, 242, 243, 9, 5, 2, 2, 243, 263, 5, 42, 22, 16, 244, 256, 7, 24, 2, 2, 245, 250, 5, 42, 22, 2, 246, 247, 7, 18, 2, 2, 247, 249, 5, 42, 22, 2, 248, 246, 3, 2, 2, 2, 249, 252, 3, 2, 2, 2, 250, 248, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 253, 255, 7, 18, 2, 2, 254, 253, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 257, 3, 2, 2, 2, 256, 245, 3, 2, 2, 2, 256, 257, 3, 2, 2, 2, 257, 258, 3, 2, 2, 2, 258, 263, 7, 25, 2, 2, 259, 263, 7, 69, 2, 2, 260, 263, 7, 70, 2, 2, 261, 263, 5, 46, 24, 2, 262, 209, 3, 2, 2, 2, 262, 214, 3, 2, 2, 2, 262, 226, 3, 2, 2, 2, 262, 227, 3, 2, 2, 2, 262, 230, 3, 2, 2, 2, 262, 236, 3, 2, 2, 2, 262, 242, 3, 2, 2, 2, 262, 244, 3, 2, 2, 2, 262, 259, 3, 2, 2, 2, 262, 260, 3, 2, 2, 2, 262, 261, 3, 2, 2, 2, 263, 305, 3, 2, 2, 2, 264, 265, 12, 15, 2, 2, 265, 266, 9, 6, 2, 2, 266, 304, 5, 42, 22, 16, 267, 268, 12, 14, 2, 2, 268, 269, 9, 7, 2, 2, 269, 304, 5, 42, 22, 15, 270, 271, 12, 13, 2, 2, 271, 272, 9, 8, 2, 2, 272, 304, 5, 42, 22, 14, 273, 274, 12, 12, 2, 2, 274, 275, 9, 9, 2, 2, 275, 304, 5, 42, 22, 13, 276, 277, 12, 11, 2, 2, 277, 278, 7, 48, 2, 2, 278, 304, 5, 42, 22, 12, 279, 280, 12, 10, 2, 2, 280, 281, 7, 6, 2, 2, 281, 304, 5, 42, 22, 11, 282, 283, 12, 9, 2, 2, 283, 284, 7, 49, 2, 2, 284, 304, 5, 42, 22, 10, 285, 286, 12, 8, 2, 2, 286, 287, 7, 50, 2, 2, 287, 304, 5, 42, 22, 9, 288, 289, 12, 7, 2, 2, 289, 290, 7, 51, 2, 2, 290, 304, 5, 42, 22, 8, 291, 292, 12, 21, 2, 2, 292, 293, 7, 24, 2, 2, 293, 294, 7, 62, 2, 2, 294, 304, 7, 25, 2, 2, 295, 296, 12, 18, 2, 2, 296, 304, 9, 10, 2, 2, 297, 298, 12, 17, 2, 2, 298, 299, 7, 39, 2, 2, 299, 300, 7, 17, 2, 2, 300, 301, 5, 42, 22, 2, 301, 302, 7, 19, 2, 2, 302, 304, 3, 2, 2, 2, 303, 264, 3, 2, 2, 2, 303, 267, 3, 2, 2, 2, 303, 270, 3, 2, 2, 2, 303, 273, 3, 2, 2, 2, 303, 276, 3, 2, 2, 2, 303, 279, 3, 2, 2, 2, 303, 282, 3, 2, 2, 2, 303, 285, 3, 2, 2, 2, 303, 288, 3, 2, 2, 2, 303, 291, 3, 2, 2, 2, 303, 295, 3, 2, 2, 2, 303, 297, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 43, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 52, 2, 2, 309, 45, 3, 2, 2, 2, 310, 316, 7, 60, 2, 2, 311, 316, 5, 48, 25, 2, 312, 316, 7, 65, 2, 2, 313, 316, 7, 66, 2, 2, 314, 316, 7, 67, 2, 2, 315, 310, 3, 2, 2, 2, 315, 311, 3, 2, 2, 2, 315, 312, 3, 2, 2, 2, 315, 313, 3, 2, 2, 2, 315, 314, 3, 2, 2, 2, 316, 47, 3, 2, 2, 2, 317, 319, 7, 62, 2, 2, 318, 320, 7, 61, 2, 2, 319, 318, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 49, 3, 2, 2, 2, 321, 322, 9, 11, 2, 2, 322, 51, 3, 2, 2, 2, 28, 55, 70, 73, 86, 98, 109, 113, 115, 126, 131, 139, 145, 188, 199, 203, 205, 219, 222, 250, 254, 256, 262, 303, 305, 315, 319] \ No newline at end of file +[4, 1, 71, 322, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 1, 0, 5, 0, 52, 8, 0, 10, 0, 12, 0, 55, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 69, 8, 3, 1, 4, 3, 4, 72, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 83, 8, 6, 10, 6, 12, 6, 86, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 95, 8, 7, 10, 7, 12, 7, 98, 9, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 106, 8, 8, 10, 8, 12, 8, 109, 9, 8, 1, 8, 3, 8, 112, 8, 8, 3, 8, 114, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 5, 10, 123, 8, 10, 10, 10, 12, 10, 126, 9, 10, 1, 10, 1, 10, 3, 10, 130, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 138, 8, 11, 1, 12, 1, 12, 5, 12, 142, 8, 12, 10, 12, 12, 12, 145, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 187, 8, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 196, 8, 19, 10, 19, 12, 19, 199, 9, 19, 1, 19, 3, 19, 202, 8, 19, 3, 19, 204, 8, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 218, 8, 20, 1, 20, 3, 20, 221, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 247, 8, 20, 10, 20, 12, 20, 250, 9, 20, 1, 20, 3, 20, 253, 8, 20, 3, 20, 255, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 261, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 302, 8, 20, 10, 20, 12, 20, 305, 9, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 314, 8, 22, 1, 23, 1, 23, 3, 23, 318, 8, 23, 1, 24, 1, 24, 1, 24, 0, 1, 40, 25, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 0, 10, 1, 0, 4, 10, 1, 0, 25, 29, 2, 0, 25, 29, 31, 34, 1, 0, 38, 39, 1, 0, 40, 42, 2, 0, 39, 39, 43, 43, 1, 0, 6, 9, 1, 0, 44, 45, 1, 0, 35, 36, 2, 0, 51, 56, 61, 61, 348, 0, 53, 1, 0, 0, 0, 2, 59, 1, 0, 0, 0, 4, 64, 1, 0, 0, 0, 6, 66, 1, 0, 0, 0, 8, 71, 1, 0, 0, 0, 10, 75, 1, 0, 0, 0, 12, 77, 1, 0, 0, 0, 14, 89, 1, 0, 0, 0, 16, 101, 1, 0, 0, 0, 18, 117, 1, 0, 0, 0, 20, 129, 1, 0, 0, 0, 22, 137, 1, 0, 0, 0, 24, 139, 1, 0, 0, 0, 26, 151, 1, 0, 0, 0, 28, 160, 1, 0, 0, 0, 30, 165, 1, 0, 0, 0, 32, 173, 1, 0, 0, 0, 34, 179, 1, 0, 0, 0, 36, 188, 1, 0, 0, 0, 38, 191, 1, 0, 0, 0, 40, 260, 1, 0, 0, 0, 42, 306, 1, 0, 0, 0, 44, 313, 1, 0, 0, 0, 46, 315, 1, 0, 0, 0, 48, 319, 1, 0, 0, 0, 50, 52, 3, 2, 1, 0, 51, 50, 1, 0, 0, 0, 52, 55, 1, 0, 0, 0, 53, 51, 1, 0, 0, 0, 53, 54, 1, 0, 0, 0, 54, 56, 1, 0, 0, 0, 55, 53, 1, 0, 0, 0, 56, 57, 3, 12, 6, 0, 57, 58, 5, 0, 0, 1, 58, 1, 1, 0, 0, 0, 59, 60, 5, 1, 0, 0, 60, 61, 3, 4, 2, 0, 61, 62, 3, 6, 3, 0, 62, 63, 5, 2, 0, 0, 63, 3, 1, 0, 0, 0, 64, 65, 5, 3, 0, 0, 65, 5, 1, 0, 0, 0, 66, 68, 3, 8, 4, 0, 67, 69, 3, 8, 4, 0, 68, 67, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 7, 1, 0, 0, 0, 70, 72, 3, 10, 5, 0, 71, 70, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 74, 5, 57, 0, 0, 74, 9, 1, 0, 0, 0, 75, 76, 7, 0, 0, 0, 76, 11, 1, 0, 0, 0, 77, 78, 5, 11, 0, 0, 78, 79, 5, 68, 0, 0, 79, 80, 3, 16, 8, 0, 80, 84, 5, 12, 0, 0, 81, 83, 3, 14, 7, 0, 82, 81, 1, 0, 0, 0, 83, 86, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 84, 85, 1, 0, 0, 0, 85, 87, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 87, 88, 5, 13, 0, 0, 88, 13, 1, 0, 0, 0, 89, 90, 5, 14, 0, 0, 90, 91, 5, 68, 0, 0, 91, 92, 3, 16, 8, 0, 92, 96, 5, 12, 0, 0, 93, 95, 3, 22, 11, 0, 94, 93, 1, 0, 0, 0, 95, 98, 1, 0, 0, 0, 96, 94, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 99, 1, 0, 0, 0, 98, 96, 1, 0, 0, 0, 99, 100, 5, 13, 0, 0, 100, 15, 1, 0, 0, 0, 101, 113, 5, 15, 0, 0, 102, 107, 3, 18, 9, 0, 103, 104, 5, 16, 0, 0, 104, 106, 3, 18, 9, 0, 105, 103, 1, 0, 0, 0, 106, 109, 1, 0, 0, 0, 107, 105, 1, 0, 0, 0, 107, 108, 1, 0, 0, 0, 108, 111, 1, 0, 0, 0, 109, 107, 1, 0, 0, 0, 110, 112, 5, 16, 0, 0, 111, 110, 1, 0, 0, 0, 111, 112, 1, 0, 0, 0, 112, 114, 1, 0, 0, 0, 113, 102, 1, 0, 0, 0, 113, 114, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 116, 5, 17, 0, 0, 116, 17, 1, 0, 0, 0, 117, 118, 3, 48, 24, 0, 118, 119, 5, 68, 0, 0, 119, 19, 1, 0, 0, 0, 120, 124, 5, 12, 0, 0, 121, 123, 3, 22, 11, 0, 122, 121, 1, 0, 0, 0, 123, 126, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 127, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 127, 130, 5, 13, 0, 0, 128, 130, 3, 22, 11, 0, 129, 120, 1, 0, 0, 0, 129, 128, 1, 0, 0, 0, 130, 21, 1, 0, 0, 0, 131, 138, 3, 24, 12, 0, 132, 138, 3, 26, 13, 0, 133, 138, 3, 28, 14, 0, 134, 138, 3, 30, 15, 0, 135, 138, 3, 32, 16, 0, 136, 138, 3, 34, 17, 0, 137, 131, 1, 0, 0, 0, 137, 132, 1, 0, 0, 0, 137, 133, 1, 0, 0, 0, 137, 134, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 136, 1, 0, 0, 0, 138, 23, 1, 0, 0, 0, 139, 143, 3, 48, 24, 0, 140, 142, 3, 42, 21, 0, 141, 140, 1, 0, 0, 0, 142, 145, 1, 0, 0, 0, 143, 141, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 146, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 146, 147, 5, 68, 0, 0, 147, 148, 5, 10, 0, 0, 148, 149, 3, 40, 20, 0, 149, 150, 5, 2, 0, 0, 150, 25, 1, 0, 0, 0, 151, 152, 3, 48, 24, 0, 152, 153, 5, 68, 0, 0, 153, 154, 5, 16, 0, 0, 154, 155, 3, 48, 24, 0, 155, 156, 5, 68, 0, 0, 156, 157, 5, 10, 0, 0, 157, 158, 3, 40, 20, 0, 158, 159, 5, 2, 0, 0, 159, 27, 1, 0, 0, 0, 160, 161, 5, 68, 0, 0, 161, 162, 5, 10, 0, 0, 162, 163, 3, 40, 20, 0, 163, 164, 5, 2, 0, 0, 164, 29, 1, 0, 0, 0, 165, 166, 5, 18, 0, 0, 166, 167, 5, 15, 0, 0, 167, 168, 5, 66, 0, 0, 168, 169, 5, 6, 0, 0, 169, 170, 3, 40, 20, 0, 170, 171, 5, 17, 0, 0, 171, 172, 5, 2, 0, 0, 172, 31, 1, 0, 0, 0, 173, 174, 5, 18, 0, 0, 174, 175, 5, 15, 0, 0, 175, 176, 3, 40, 20, 0, 176, 177, 5, 17, 0, 0, 177, 178, 5, 2, 0, 0, 178, 33, 1, 0, 0, 0, 179, 180, 5, 19, 0, 0, 180, 181, 5, 15, 0, 0, 181, 182, 3, 40, 20, 0, 182, 183, 5, 17, 0, 0, 183, 186, 3, 20, 10, 0, 184, 185, 5, 20, 0, 0, 185, 187, 3, 20, 10, 0, 186, 184, 1, 0, 0, 0, 186, 187, 1, 0, 0, 0, 187, 35, 1, 0, 0, 0, 188, 189, 5, 68, 0, 0, 189, 190, 3, 38, 19, 0, 190, 37, 1, 0, 0, 0, 191, 203, 5, 15, 0, 0, 192, 197, 3, 40, 20, 0, 193, 194, 5, 16, 0, 0, 194, 196, 3, 40, 20, 0, 195, 193, 1, 0, 0, 0, 196, 199, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 201, 1, 0, 0, 0, 199, 197, 1, 0, 0, 0, 200, 202, 5, 16, 0, 0, 201, 200, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 204, 1, 0, 0, 0, 203, 192, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 5, 17, 0, 0, 206, 39, 1, 0, 0, 0, 207, 208, 6, 20, -1, 0, 208, 209, 5, 15, 0, 0, 209, 210, 3, 40, 20, 0, 210, 211, 5, 17, 0, 0, 211, 261, 1, 0, 0, 0, 212, 213, 3, 48, 24, 0, 213, 214, 5, 15, 0, 0, 214, 217, 3, 40, 20, 0, 215, 216, 5, 16, 0, 0, 216, 218, 3, 40, 20, 0, 217, 215, 1, 0, 0, 0, 217, 218, 1, 0, 0, 0, 218, 220, 1, 0, 0, 0, 219, 221, 5, 16, 0, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 223, 5, 17, 0, 0, 223, 261, 1, 0, 0, 0, 224, 261, 3, 36, 18, 0, 225, 226, 5, 21, 0, 0, 226, 227, 5, 68, 0, 0, 227, 261, 3, 38, 19, 0, 228, 229, 5, 24, 0, 0, 229, 230, 5, 22, 0, 0, 230, 231, 3, 40, 20, 0, 231, 232, 5, 23, 0, 0, 232, 233, 7, 1, 0, 0, 233, 261, 1, 0, 0, 0, 234, 235, 5, 30, 0, 0, 235, 236, 5, 22, 0, 0, 236, 237, 3, 40, 20, 0, 237, 238, 5, 23, 0, 0, 238, 239, 7, 2, 0, 0, 239, 261, 1, 0, 0, 0, 240, 241, 7, 3, 0, 0, 241, 261, 3, 40, 20, 14, 242, 254, 5, 22, 0, 0, 243, 248, 3, 40, 20, 0, 244, 245, 5, 16, 0, 0, 245, 247, 3, 40, 20, 0, 246, 244, 1, 0, 0, 0, 247, 250, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 248, 249, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 251, 253, 5, 16, 0, 0, 252, 251, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 255, 1, 0, 0, 0, 254, 243, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 261, 5, 23, 0, 0, 257, 261, 5, 67, 0, 0, 258, 261, 5, 68, 0, 0, 259, 261, 3, 44, 22, 0, 260, 207, 1, 0, 0, 0, 260, 212, 1, 0, 0, 0, 260, 224, 1, 0, 0, 0, 260, 225, 1, 0, 0, 0, 260, 228, 1, 0, 0, 0, 260, 234, 1, 0, 0, 0, 260, 240, 1, 0, 0, 0, 260, 242, 1, 0, 0, 0, 260, 257, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 260, 259, 1, 0, 0, 0, 261, 303, 1, 0, 0, 0, 262, 263, 10, 13, 0, 0, 263, 264, 7, 4, 0, 0, 264, 302, 3, 40, 20, 14, 265, 266, 10, 12, 0, 0, 266, 267, 7, 5, 0, 0, 267, 302, 3, 40, 20, 13, 268, 269, 10, 11, 0, 0, 269, 270, 7, 6, 0, 0, 270, 302, 3, 40, 20, 12, 271, 272, 10, 10, 0, 0, 272, 273, 7, 7, 0, 0, 273, 302, 3, 40, 20, 11, 274, 275, 10, 9, 0, 0, 275, 276, 5, 46, 0, 0, 276, 302, 3, 40, 20, 10, 277, 278, 10, 8, 0, 0, 278, 279, 5, 4, 0, 0, 279, 302, 3, 40, 20, 9, 280, 281, 10, 7, 0, 0, 281, 282, 5, 47, 0, 0, 282, 302, 3, 40, 20, 8, 283, 284, 10, 6, 0, 0, 284, 285, 5, 48, 0, 0, 285, 302, 3, 40, 20, 7, 286, 287, 10, 5, 0, 0, 287, 288, 5, 49, 0, 0, 288, 302, 3, 40, 20, 6, 289, 290, 10, 19, 0, 0, 290, 291, 5, 22, 0, 0, 291, 292, 5, 60, 0, 0, 292, 302, 5, 23, 0, 0, 293, 294, 10, 16, 0, 0, 294, 302, 7, 8, 0, 0, 295, 296, 10, 15, 0, 0, 296, 297, 5, 37, 0, 0, 297, 298, 5, 15, 0, 0, 298, 299, 3, 40, 20, 0, 299, 300, 5, 17, 0, 0, 300, 302, 1, 0, 0, 0, 301, 262, 1, 0, 0, 0, 301, 265, 1, 0, 0, 0, 301, 268, 1, 0, 0, 0, 301, 271, 1, 0, 0, 0, 301, 274, 1, 0, 0, 0, 301, 277, 1, 0, 0, 0, 301, 280, 1, 0, 0, 0, 301, 283, 1, 0, 0, 0, 301, 286, 1, 0, 0, 0, 301, 289, 1, 0, 0, 0, 301, 293, 1, 0, 0, 0, 301, 295, 1, 0, 0, 0, 302, 305, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 41, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 306, 307, 5, 50, 0, 0, 307, 43, 1, 0, 0, 0, 308, 314, 5, 58, 0, 0, 309, 314, 3, 46, 23, 0, 310, 314, 5, 63, 0, 0, 311, 314, 5, 64, 0, 0, 312, 314, 5, 65, 0, 0, 313, 308, 1, 0, 0, 0, 313, 309, 1, 0, 0, 0, 313, 310, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 312, 1, 0, 0, 0, 314, 45, 1, 0, 0, 0, 315, 317, 5, 60, 0, 0, 316, 318, 5, 59, 0, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 47, 1, 0, 0, 0, 319, 320, 7, 9, 0, 0, 320, 49, 1, 0, 0, 0, 26, 53, 68, 71, 84, 96, 107, 111, 113, 124, 129, 137, 143, 186, 197, 201, 203, 217, 220, 248, 252, 254, 260, 301, 303, 313, 317] \ No newline at end of file diff --git a/packages/cashc/src/grammar/CashScriptLexer.interp b/packages/cashc/src/grammar/CashScriptLexer.interp index 65c158ce..3670f3d0 100644 --- a/packages/cashc/src/grammar/CashScriptLexer.interp +++ b/packages/cashc/src/grammar/CashScriptLexer.interp @@ -227,4 +227,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 73, 808, 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, 4, 72, 9, 72, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 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, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 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, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 6, 58, 496, 10, 58, 13, 58, 14, 58, 497, 3, 58, 3, 58, 6, 58, 502, 10, 58, 13, 58, 14, 58, 503, 3, 58, 3, 58, 6, 58, 508, 10, 58, 13, 58, 14, 58, 509, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 5, 59, 521, 10, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 5, 60, 580, 10, 60, 3, 61, 5, 61, 583, 10, 61, 3, 61, 6, 61, 586, 10, 61, 13, 61, 14, 61, 587, 3, 61, 3, 61, 6, 61, 592, 10, 61, 13, 61, 14, 61, 593, 5, 61, 596, 10, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 5, 62, 605, 10, 62, 3, 62, 3, 62, 3, 62, 3, 62, 5, 62, 611, 10, 62, 3, 63, 3, 63, 7, 63, 615, 10, 63, 12, 63, 14, 63, 618, 11, 63, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 624, 10, 64, 12, 64, 14, 64, 627, 11, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 634, 10, 64, 12, 64, 14, 64, 637, 11, 64, 3, 64, 5, 64, 640, 10, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 7, 66, 654, 10, 66, 12, 66, 14, 66, 657, 11, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 672, 10, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 5, 68, 768, 10, 68, 3, 69, 3, 69, 7, 69, 772, 10, 69, 12, 69, 14, 69, 775, 11, 69, 3, 70, 6, 70, 778, 10, 70, 13, 70, 14, 70, 779, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 7, 71, 788, 10, 71, 12, 71, 14, 71, 791, 11, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 7, 72, 802, 10, 72, 12, 72, 14, 72, 805, 11, 72, 3, 72, 3, 72, 5, 625, 635, 789, 2, 2, 73, 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, 143, 2, 73, 3, 2, 14, 3, 2, 50, 59, 3, 2, 47, 47, 4, 2, 71, 71, 103, 103, 3, 2, 51, 59, 5, 2, 12, 12, 15, 15, 36, 36, 5, 2, 12, 12, 15, 15, 41, 41, 4, 2, 90, 90, 122, 122, 5, 2, 50, 59, 67, 72, 99, 104, 4, 2, 67, 92, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 843, 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, 2, 143, 3, 2, 2, 2, 3, 145, 3, 2, 2, 2, 5, 152, 3, 2, 2, 2, 7, 154, 3, 2, 2, 2, 9, 165, 3, 2, 2, 2, 11, 167, 3, 2, 2, 2, 13, 169, 3, 2, 2, 2, 15, 172, 3, 2, 2, 2, 17, 174, 3, 2, 2, 2, 19, 176, 3, 2, 2, 2, 21, 179, 3, 2, 2, 2, 23, 181, 3, 2, 2, 2, 25, 190, 3, 2, 2, 2, 27, 192, 3, 2, 2, 2, 29, 194, 3, 2, 2, 2, 31, 203, 3, 2, 2, 2, 33, 205, 3, 2, 2, 2, 35, 207, 3, 2, 2, 2, 37, 209, 3, 2, 2, 2, 39, 217, 3, 2, 2, 2, 41, 220, 3, 2, 2, 2, 43, 225, 3, 2, 2, 2, 45, 229, 3, 2, 2, 2, 47, 231, 3, 2, 2, 2, 49, 233, 3, 2, 2, 2, 51, 244, 3, 2, 2, 2, 53, 251, 3, 2, 2, 2, 55, 268, 3, 2, 2, 2, 57, 283, 3, 2, 2, 2, 59, 298, 3, 2, 2, 2, 61, 311, 3, 2, 2, 2, 63, 321, 3, 2, 2, 2, 65, 346, 3, 2, 2, 2, 67, 361, 3, 2, 2, 2, 69, 380, 3, 2, 2, 2, 71, 396, 3, 2, 2, 2, 73, 407, 3, 2, 2, 2, 75, 415, 3, 2, 2, 2, 77, 422, 3, 2, 2, 2, 79, 424, 3, 2, 2, 2, 81, 426, 3, 2, 2, 2, 83, 428, 3, 2, 2, 2, 85, 430, 3, 2, 2, 2, 87, 432, 3, 2, 2, 2, 89, 434, 3, 2, 2, 2, 91, 437, 3, 2, 2, 2, 93, 440, 3, 2, 2, 2, 95, 442, 3, 2, 2, 2, 97, 444, 3, 2, 2, 2, 99, 447, 3, 2, 2, 2, 101, 450, 3, 2, 2, 2, 103, 459, 3, 2, 2, 2, 105, 463, 3, 2, 2, 2, 107, 468, 3, 2, 2, 2, 109, 475, 3, 2, 2, 2, 111, 482, 3, 2, 2, 2, 113, 486, 3, 2, 2, 2, 115, 495, 3, 2, 2, 2, 117, 520, 3, 2, 2, 2, 119, 579, 3, 2, 2, 2, 121, 582, 3, 2, 2, 2, 123, 610, 3, 2, 2, 2, 125, 612, 3, 2, 2, 2, 127, 639, 3, 2, 2, 2, 129, 641, 3, 2, 2, 2, 131, 650, 3, 2, 2, 2, 133, 671, 3, 2, 2, 2, 135, 767, 3, 2, 2, 2, 137, 769, 3, 2, 2, 2, 139, 777, 3, 2, 2, 2, 141, 783, 3, 2, 2, 2, 143, 797, 3, 2, 2, 2, 145, 146, 7, 114, 2, 2, 146, 147, 7, 116, 2, 2, 147, 148, 7, 99, 2, 2, 148, 149, 7, 105, 2, 2, 149, 150, 7, 111, 2, 2, 150, 151, 7, 99, 2, 2, 151, 4, 3, 2, 2, 2, 152, 153, 7, 61, 2, 2, 153, 6, 3, 2, 2, 2, 154, 155, 7, 101, 2, 2, 155, 156, 7, 99, 2, 2, 156, 157, 7, 117, 2, 2, 157, 158, 7, 106, 2, 2, 158, 159, 7, 117, 2, 2, 159, 160, 7, 101, 2, 2, 160, 161, 7, 116, 2, 2, 161, 162, 7, 107, 2, 2, 162, 163, 7, 114, 2, 2, 163, 164, 7, 118, 2, 2, 164, 8, 3, 2, 2, 2, 165, 166, 7, 96, 2, 2, 166, 10, 3, 2, 2, 2, 167, 168, 7, 128, 2, 2, 168, 12, 3, 2, 2, 2, 169, 170, 7, 64, 2, 2, 170, 171, 7, 63, 2, 2, 171, 14, 3, 2, 2, 2, 172, 173, 7, 64, 2, 2, 173, 16, 3, 2, 2, 2, 174, 175, 7, 62, 2, 2, 175, 18, 3, 2, 2, 2, 176, 177, 7, 62, 2, 2, 177, 178, 7, 63, 2, 2, 178, 20, 3, 2, 2, 2, 179, 180, 7, 63, 2, 2, 180, 22, 3, 2, 2, 2, 181, 182, 7, 101, 2, 2, 182, 183, 7, 113, 2, 2, 183, 184, 7, 112, 2, 2, 184, 185, 7, 118, 2, 2, 185, 186, 7, 116, 2, 2, 186, 187, 7, 99, 2, 2, 187, 188, 7, 101, 2, 2, 188, 189, 7, 118, 2, 2, 189, 24, 3, 2, 2, 2, 190, 191, 7, 125, 2, 2, 191, 26, 3, 2, 2, 2, 192, 193, 7, 127, 2, 2, 193, 28, 3, 2, 2, 2, 194, 195, 7, 104, 2, 2, 195, 196, 7, 119, 2, 2, 196, 197, 7, 112, 2, 2, 197, 198, 7, 101, 2, 2, 198, 199, 7, 118, 2, 2, 199, 200, 7, 107, 2, 2, 200, 201, 7, 113, 2, 2, 201, 202, 7, 112, 2, 2, 202, 30, 3, 2, 2, 2, 203, 204, 7, 42, 2, 2, 204, 32, 3, 2, 2, 2, 205, 206, 7, 46, 2, 2, 206, 34, 3, 2, 2, 2, 207, 208, 7, 43, 2, 2, 208, 36, 3, 2, 2, 2, 209, 210, 7, 116, 2, 2, 210, 211, 7, 103, 2, 2, 211, 212, 7, 115, 2, 2, 212, 213, 7, 119, 2, 2, 213, 214, 7, 107, 2, 2, 214, 215, 7, 116, 2, 2, 215, 216, 7, 103, 2, 2, 216, 38, 3, 2, 2, 2, 217, 218, 7, 107, 2, 2, 218, 219, 7, 104, 2, 2, 219, 40, 3, 2, 2, 2, 220, 221, 7, 103, 2, 2, 221, 222, 7, 110, 2, 2, 222, 223, 7, 117, 2, 2, 223, 224, 7, 103, 2, 2, 224, 42, 3, 2, 2, 2, 225, 226, 7, 112, 2, 2, 226, 227, 7, 103, 2, 2, 227, 228, 7, 121, 2, 2, 228, 44, 3, 2, 2, 2, 229, 230, 7, 93, 2, 2, 230, 46, 3, 2, 2, 2, 231, 232, 7, 95, 2, 2, 232, 48, 3, 2, 2, 2, 233, 234, 7, 118, 2, 2, 234, 235, 7, 122, 2, 2, 235, 236, 7, 48, 2, 2, 236, 237, 7, 113, 2, 2, 237, 238, 7, 119, 2, 2, 238, 239, 7, 118, 2, 2, 239, 240, 7, 114, 2, 2, 240, 241, 7, 119, 2, 2, 241, 242, 7, 118, 2, 2, 242, 243, 7, 117, 2, 2, 243, 50, 3, 2, 2, 2, 244, 245, 7, 48, 2, 2, 245, 246, 7, 120, 2, 2, 246, 247, 7, 99, 2, 2, 247, 248, 7, 110, 2, 2, 248, 249, 7, 119, 2, 2, 249, 250, 7, 103, 2, 2, 250, 52, 3, 2, 2, 2, 251, 252, 7, 48, 2, 2, 252, 253, 7, 110, 2, 2, 253, 254, 7, 113, 2, 2, 254, 255, 7, 101, 2, 2, 255, 256, 7, 109, 2, 2, 256, 257, 7, 107, 2, 2, 257, 258, 7, 112, 2, 2, 258, 259, 7, 105, 2, 2, 259, 260, 7, 68, 2, 2, 260, 261, 7, 123, 2, 2, 261, 262, 7, 118, 2, 2, 262, 263, 7, 103, 2, 2, 263, 264, 7, 101, 2, 2, 264, 265, 7, 113, 2, 2, 265, 266, 7, 102, 2, 2, 266, 267, 7, 103, 2, 2, 267, 54, 3, 2, 2, 2, 268, 269, 7, 48, 2, 2, 269, 270, 7, 118, 2, 2, 270, 271, 7, 113, 2, 2, 271, 272, 7, 109, 2, 2, 272, 273, 7, 103, 2, 2, 273, 274, 7, 112, 2, 2, 274, 275, 7, 69, 2, 2, 275, 276, 7, 99, 2, 2, 276, 277, 7, 118, 2, 2, 277, 278, 7, 103, 2, 2, 278, 279, 7, 105, 2, 2, 279, 280, 7, 113, 2, 2, 280, 281, 7, 116, 2, 2, 281, 282, 7, 123, 2, 2, 282, 56, 3, 2, 2, 2, 283, 284, 7, 48, 2, 2, 284, 285, 7, 112, 2, 2, 285, 286, 7, 104, 2, 2, 286, 287, 7, 118, 2, 2, 287, 288, 7, 69, 2, 2, 288, 289, 7, 113, 2, 2, 289, 290, 7, 111, 2, 2, 290, 291, 7, 111, 2, 2, 291, 292, 7, 107, 2, 2, 292, 293, 7, 118, 2, 2, 293, 294, 7, 111, 2, 2, 294, 295, 7, 103, 2, 2, 295, 296, 7, 112, 2, 2, 296, 297, 7, 118, 2, 2, 297, 58, 3, 2, 2, 2, 298, 299, 7, 48, 2, 2, 299, 300, 7, 118, 2, 2, 300, 301, 7, 113, 2, 2, 301, 302, 7, 109, 2, 2, 302, 303, 7, 103, 2, 2, 303, 304, 7, 112, 2, 2, 304, 305, 7, 67, 2, 2, 305, 306, 7, 111, 2, 2, 306, 307, 7, 113, 2, 2, 307, 308, 7, 119, 2, 2, 308, 309, 7, 112, 2, 2, 309, 310, 7, 118, 2, 2, 310, 60, 3, 2, 2, 2, 311, 312, 7, 118, 2, 2, 312, 313, 7, 122, 2, 2, 313, 314, 7, 48, 2, 2, 314, 315, 7, 107, 2, 2, 315, 316, 7, 112, 2, 2, 316, 317, 7, 114, 2, 2, 317, 318, 7, 119, 2, 2, 318, 319, 7, 118, 2, 2, 319, 320, 7, 117, 2, 2, 320, 62, 3, 2, 2, 2, 321, 322, 7, 48, 2, 2, 322, 323, 7, 113, 2, 2, 323, 324, 7, 119, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 114, 2, 2, 326, 327, 7, 113, 2, 2, 327, 328, 7, 107, 2, 2, 328, 329, 7, 112, 2, 2, 329, 330, 7, 118, 2, 2, 330, 331, 7, 86, 2, 2, 331, 332, 7, 116, 2, 2, 332, 333, 7, 99, 2, 2, 333, 334, 7, 112, 2, 2, 334, 335, 7, 117, 2, 2, 335, 336, 7, 99, 2, 2, 336, 337, 7, 101, 2, 2, 337, 338, 7, 118, 2, 2, 338, 339, 7, 107, 2, 2, 339, 340, 7, 113, 2, 2, 340, 341, 7, 112, 2, 2, 341, 342, 7, 74, 2, 2, 342, 343, 7, 99, 2, 2, 343, 344, 7, 117, 2, 2, 344, 345, 7, 106, 2, 2, 345, 64, 3, 2, 2, 2, 346, 347, 7, 48, 2, 2, 347, 348, 7, 113, 2, 2, 348, 349, 7, 119, 2, 2, 349, 350, 7, 118, 2, 2, 350, 351, 7, 114, 2, 2, 351, 352, 7, 113, 2, 2, 352, 353, 7, 107, 2, 2, 353, 354, 7, 112, 2, 2, 354, 355, 7, 118, 2, 2, 355, 356, 7, 75, 2, 2, 356, 357, 7, 112, 2, 2, 357, 358, 7, 102, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 122, 2, 2, 360, 66, 3, 2, 2, 2, 361, 362, 7, 48, 2, 2, 362, 363, 7, 119, 2, 2, 363, 364, 7, 112, 2, 2, 364, 365, 7, 110, 2, 2, 365, 366, 7, 113, 2, 2, 366, 367, 7, 101, 2, 2, 367, 368, 7, 109, 2, 2, 368, 369, 7, 107, 2, 2, 369, 370, 7, 112, 2, 2, 370, 371, 7, 105, 2, 2, 371, 372, 7, 68, 2, 2, 372, 373, 7, 123, 2, 2, 373, 374, 7, 118, 2, 2, 374, 375, 7, 103, 2, 2, 375, 376, 7, 101, 2, 2, 376, 377, 7, 113, 2, 2, 377, 378, 7, 102, 2, 2, 378, 379, 7, 103, 2, 2, 379, 68, 3, 2, 2, 2, 380, 381, 7, 48, 2, 2, 381, 382, 7, 117, 2, 2, 382, 383, 7, 103, 2, 2, 383, 384, 7, 115, 2, 2, 384, 385, 7, 119, 2, 2, 385, 386, 7, 103, 2, 2, 386, 387, 7, 112, 2, 2, 387, 388, 7, 101, 2, 2, 388, 389, 7, 103, 2, 2, 389, 390, 7, 80, 2, 2, 390, 391, 7, 119, 2, 2, 391, 392, 7, 111, 2, 2, 392, 393, 7, 100, 2, 2, 393, 394, 7, 103, 2, 2, 394, 395, 7, 116, 2, 2, 395, 70, 3, 2, 2, 2, 396, 397, 7, 48, 2, 2, 397, 398, 7, 116, 2, 2, 398, 399, 7, 103, 2, 2, 399, 400, 7, 120, 2, 2, 400, 401, 7, 103, 2, 2, 401, 402, 7, 116, 2, 2, 402, 403, 7, 117, 2, 2, 403, 404, 7, 103, 2, 2, 404, 405, 7, 42, 2, 2, 405, 406, 7, 43, 2, 2, 406, 72, 3, 2, 2, 2, 407, 408, 7, 48, 2, 2, 408, 409, 7, 110, 2, 2, 409, 410, 7, 103, 2, 2, 410, 411, 7, 112, 2, 2, 411, 412, 7, 105, 2, 2, 412, 413, 7, 118, 2, 2, 413, 414, 7, 106, 2, 2, 414, 74, 3, 2, 2, 2, 415, 416, 7, 48, 2, 2, 416, 417, 7, 117, 2, 2, 417, 418, 7, 114, 2, 2, 418, 419, 7, 110, 2, 2, 419, 420, 7, 107, 2, 2, 420, 421, 7, 118, 2, 2, 421, 76, 3, 2, 2, 2, 422, 423, 7, 35, 2, 2, 423, 78, 3, 2, 2, 2, 424, 425, 7, 47, 2, 2, 425, 80, 3, 2, 2, 2, 426, 427, 7, 44, 2, 2, 427, 82, 3, 2, 2, 2, 428, 429, 7, 49, 2, 2, 429, 84, 3, 2, 2, 2, 430, 431, 7, 39, 2, 2, 431, 86, 3, 2, 2, 2, 432, 433, 7, 45, 2, 2, 433, 88, 3, 2, 2, 2, 434, 435, 7, 63, 2, 2, 435, 436, 7, 63, 2, 2, 436, 90, 3, 2, 2, 2, 437, 438, 7, 35, 2, 2, 438, 439, 7, 63, 2, 2, 439, 92, 3, 2, 2, 2, 440, 441, 7, 40, 2, 2, 441, 94, 3, 2, 2, 2, 442, 443, 7, 126, 2, 2, 443, 96, 3, 2, 2, 2, 444, 445, 7, 40, 2, 2, 445, 446, 7, 40, 2, 2, 446, 98, 3, 2, 2, 2, 447, 448, 7, 126, 2, 2, 448, 449, 7, 126, 2, 2, 449, 100, 3, 2, 2, 2, 450, 451, 7, 101, 2, 2, 451, 452, 7, 113, 2, 2, 452, 453, 7, 112, 2, 2, 453, 454, 7, 117, 2, 2, 454, 455, 7, 118, 2, 2, 455, 456, 7, 99, 2, 2, 456, 457, 7, 112, 2, 2, 457, 458, 7, 118, 2, 2, 458, 102, 3, 2, 2, 2, 459, 460, 7, 107, 2, 2, 460, 461, 7, 112, 2, 2, 461, 462, 7, 118, 2, 2, 462, 104, 3, 2, 2, 2, 463, 464, 7, 100, 2, 2, 464, 465, 7, 113, 2, 2, 465, 466, 7, 113, 2, 2, 466, 467, 7, 110, 2, 2, 467, 106, 3, 2, 2, 2, 468, 469, 7, 117, 2, 2, 469, 470, 7, 118, 2, 2, 470, 471, 7, 116, 2, 2, 471, 472, 7, 107, 2, 2, 472, 473, 7, 112, 2, 2, 473, 474, 7, 105, 2, 2, 474, 108, 3, 2, 2, 2, 475, 476, 7, 114, 2, 2, 476, 477, 7, 119, 2, 2, 477, 478, 7, 100, 2, 2, 478, 479, 7, 109, 2, 2, 479, 480, 7, 103, 2, 2, 480, 481, 7, 123, 2, 2, 481, 110, 3, 2, 2, 2, 482, 483, 7, 117, 2, 2, 483, 484, 7, 107, 2, 2, 484, 485, 7, 105, 2, 2, 485, 112, 3, 2, 2, 2, 486, 487, 7, 102, 2, 2, 487, 488, 7, 99, 2, 2, 488, 489, 7, 118, 2, 2, 489, 490, 7, 99, 2, 2, 490, 491, 7, 117, 2, 2, 491, 492, 7, 107, 2, 2, 492, 493, 7, 105, 2, 2, 493, 114, 3, 2, 2, 2, 494, 496, 9, 2, 2, 2, 495, 494, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 501, 7, 48, 2, 2, 500, 502, 9, 2, 2, 2, 501, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 501, 3, 2, 2, 2, 503, 504, 3, 2, 2, 2, 504, 505, 3, 2, 2, 2, 505, 507, 7, 48, 2, 2, 506, 508, 9, 2, 2, 2, 507, 506, 3, 2, 2, 2, 508, 509, 3, 2, 2, 2, 509, 507, 3, 2, 2, 2, 509, 510, 3, 2, 2, 2, 510, 116, 3, 2, 2, 2, 511, 512, 7, 118, 2, 2, 512, 513, 7, 116, 2, 2, 513, 514, 7, 119, 2, 2, 514, 521, 7, 103, 2, 2, 515, 516, 7, 104, 2, 2, 516, 517, 7, 99, 2, 2, 517, 518, 7, 110, 2, 2, 518, 519, 7, 117, 2, 2, 519, 521, 7, 103, 2, 2, 520, 511, 3, 2, 2, 2, 520, 515, 3, 2, 2, 2, 521, 118, 3, 2, 2, 2, 522, 523, 7, 117, 2, 2, 523, 524, 7, 99, 2, 2, 524, 525, 7, 118, 2, 2, 525, 526, 7, 113, 2, 2, 526, 527, 7, 117, 2, 2, 527, 528, 7, 106, 2, 2, 528, 529, 7, 107, 2, 2, 529, 580, 7, 117, 2, 2, 530, 531, 7, 117, 2, 2, 531, 532, 7, 99, 2, 2, 532, 533, 7, 118, 2, 2, 533, 580, 7, 117, 2, 2, 534, 535, 7, 104, 2, 2, 535, 536, 7, 107, 2, 2, 536, 537, 7, 112, 2, 2, 537, 538, 7, 112, 2, 2, 538, 539, 7, 103, 2, 2, 539, 580, 7, 123, 2, 2, 540, 541, 7, 100, 2, 2, 541, 542, 7, 107, 2, 2, 542, 543, 7, 118, 2, 2, 543, 580, 7, 117, 2, 2, 544, 545, 7, 100, 2, 2, 545, 546, 7, 107, 2, 2, 546, 547, 7, 118, 2, 2, 547, 548, 7, 101, 2, 2, 548, 549, 7, 113, 2, 2, 549, 550, 7, 107, 2, 2, 550, 580, 7, 112, 2, 2, 551, 552, 7, 117, 2, 2, 552, 553, 7, 103, 2, 2, 553, 554, 7, 101, 2, 2, 554, 555, 7, 113, 2, 2, 555, 556, 7, 112, 2, 2, 556, 557, 7, 102, 2, 2, 557, 580, 7, 117, 2, 2, 558, 559, 7, 111, 2, 2, 559, 560, 7, 107, 2, 2, 560, 561, 7, 112, 2, 2, 561, 562, 7, 119, 2, 2, 562, 563, 7, 118, 2, 2, 563, 564, 7, 103, 2, 2, 564, 580, 7, 117, 2, 2, 565, 566, 7, 106, 2, 2, 566, 567, 7, 113, 2, 2, 567, 568, 7, 119, 2, 2, 568, 569, 7, 116, 2, 2, 569, 580, 7, 117, 2, 2, 570, 571, 7, 102, 2, 2, 571, 572, 7, 99, 2, 2, 572, 573, 7, 123, 2, 2, 573, 580, 7, 117, 2, 2, 574, 575, 7, 121, 2, 2, 575, 576, 7, 103, 2, 2, 576, 577, 7, 103, 2, 2, 577, 578, 7, 109, 2, 2, 578, 580, 7, 117, 2, 2, 579, 522, 3, 2, 2, 2, 579, 530, 3, 2, 2, 2, 579, 534, 3, 2, 2, 2, 579, 540, 3, 2, 2, 2, 579, 544, 3, 2, 2, 2, 579, 551, 3, 2, 2, 2, 579, 558, 3, 2, 2, 2, 579, 565, 3, 2, 2, 2, 579, 570, 3, 2, 2, 2, 579, 574, 3, 2, 2, 2, 580, 120, 3, 2, 2, 2, 581, 583, 9, 3, 2, 2, 582, 581, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 586, 9, 2, 2, 2, 585, 584, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 595, 3, 2, 2, 2, 589, 591, 9, 4, 2, 2, 590, 592, 9, 2, 2, 2, 591, 590, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 593, 591, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 596, 3, 2, 2, 2, 595, 589, 3, 2, 2, 2, 595, 596, 3, 2, 2, 2, 596, 122, 3, 2, 2, 2, 597, 598, 7, 100, 2, 2, 598, 599, 7, 123, 2, 2, 599, 600, 7, 118, 2, 2, 600, 601, 7, 103, 2, 2, 601, 602, 7, 117, 2, 2, 602, 604, 3, 2, 2, 2, 603, 605, 5, 125, 63, 2, 604, 603, 3, 2, 2, 2, 604, 605, 3, 2, 2, 2, 605, 611, 3, 2, 2, 2, 606, 607, 7, 100, 2, 2, 607, 608, 7, 123, 2, 2, 608, 609, 7, 118, 2, 2, 609, 611, 7, 103, 2, 2, 610, 597, 3, 2, 2, 2, 610, 606, 3, 2, 2, 2, 611, 124, 3, 2, 2, 2, 612, 616, 9, 5, 2, 2, 613, 615, 9, 2, 2, 2, 614, 613, 3, 2, 2, 2, 615, 618, 3, 2, 2, 2, 616, 614, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 126, 3, 2, 2, 2, 618, 616, 3, 2, 2, 2, 619, 625, 7, 36, 2, 2, 620, 621, 7, 94, 2, 2, 621, 624, 7, 36, 2, 2, 622, 624, 10, 6, 2, 2, 623, 620, 3, 2, 2, 2, 623, 622, 3, 2, 2, 2, 624, 627, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 625, 623, 3, 2, 2, 2, 626, 628, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 628, 640, 7, 36, 2, 2, 629, 635, 7, 41, 2, 2, 630, 631, 7, 94, 2, 2, 631, 634, 7, 41, 2, 2, 632, 634, 10, 7, 2, 2, 633, 630, 3, 2, 2, 2, 633, 632, 3, 2, 2, 2, 634, 637, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 635, 633, 3, 2, 2, 2, 636, 638, 3, 2, 2, 2, 637, 635, 3, 2, 2, 2, 638, 640, 7, 41, 2, 2, 639, 619, 3, 2, 2, 2, 639, 629, 3, 2, 2, 2, 640, 128, 3, 2, 2, 2, 641, 642, 7, 102, 2, 2, 642, 643, 7, 99, 2, 2, 643, 644, 7, 118, 2, 2, 644, 645, 7, 103, 2, 2, 645, 646, 7, 42, 2, 2, 646, 647, 3, 2, 2, 2, 647, 648, 5, 127, 64, 2, 648, 649, 7, 43, 2, 2, 649, 130, 3, 2, 2, 2, 650, 651, 7, 50, 2, 2, 651, 655, 9, 8, 2, 2, 652, 654, 9, 9, 2, 2, 653, 652, 3, 2, 2, 2, 654, 657, 3, 2, 2, 2, 655, 653, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 132, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 658, 659, 7, 118, 2, 2, 659, 660, 7, 122, 2, 2, 660, 661, 7, 48, 2, 2, 661, 662, 7, 99, 2, 2, 662, 663, 7, 105, 2, 2, 663, 672, 7, 103, 2, 2, 664, 665, 7, 118, 2, 2, 665, 666, 7, 122, 2, 2, 666, 667, 7, 48, 2, 2, 667, 668, 7, 118, 2, 2, 668, 669, 7, 107, 2, 2, 669, 670, 7, 111, 2, 2, 670, 672, 7, 103, 2, 2, 671, 658, 3, 2, 2, 2, 671, 664, 3, 2, 2, 2, 672, 134, 3, 2, 2, 2, 673, 674, 7, 118, 2, 2, 674, 675, 7, 106, 2, 2, 675, 676, 7, 107, 2, 2, 676, 677, 7, 117, 2, 2, 677, 678, 7, 48, 2, 2, 678, 679, 7, 99, 2, 2, 679, 680, 7, 101, 2, 2, 680, 681, 7, 118, 2, 2, 681, 682, 7, 107, 2, 2, 682, 683, 7, 120, 2, 2, 683, 684, 7, 103, 2, 2, 684, 685, 7, 75, 2, 2, 685, 686, 7, 112, 2, 2, 686, 687, 7, 114, 2, 2, 687, 688, 7, 119, 2, 2, 688, 689, 7, 118, 2, 2, 689, 690, 7, 75, 2, 2, 690, 691, 7, 112, 2, 2, 691, 692, 7, 102, 2, 2, 692, 693, 7, 103, 2, 2, 693, 768, 7, 122, 2, 2, 694, 695, 7, 118, 2, 2, 695, 696, 7, 106, 2, 2, 696, 697, 7, 107, 2, 2, 697, 698, 7, 117, 2, 2, 698, 699, 7, 48, 2, 2, 699, 700, 7, 99, 2, 2, 700, 701, 7, 101, 2, 2, 701, 702, 7, 118, 2, 2, 702, 703, 7, 107, 2, 2, 703, 704, 7, 120, 2, 2, 704, 705, 7, 103, 2, 2, 705, 706, 7, 68, 2, 2, 706, 707, 7, 123, 2, 2, 707, 708, 7, 118, 2, 2, 708, 709, 7, 103, 2, 2, 709, 710, 7, 101, 2, 2, 710, 711, 7, 113, 2, 2, 711, 712, 7, 102, 2, 2, 712, 768, 7, 103, 2, 2, 713, 714, 7, 118, 2, 2, 714, 715, 7, 122, 2, 2, 715, 716, 7, 48, 2, 2, 716, 717, 7, 107, 2, 2, 717, 718, 7, 112, 2, 2, 718, 719, 7, 114, 2, 2, 719, 720, 7, 119, 2, 2, 720, 721, 7, 118, 2, 2, 721, 722, 7, 117, 2, 2, 722, 723, 7, 48, 2, 2, 723, 724, 7, 110, 2, 2, 724, 725, 7, 103, 2, 2, 725, 726, 7, 112, 2, 2, 726, 727, 7, 105, 2, 2, 727, 728, 7, 118, 2, 2, 728, 768, 7, 106, 2, 2, 729, 730, 7, 118, 2, 2, 730, 731, 7, 122, 2, 2, 731, 732, 7, 48, 2, 2, 732, 733, 7, 113, 2, 2, 733, 734, 7, 119, 2, 2, 734, 735, 7, 118, 2, 2, 735, 736, 7, 114, 2, 2, 736, 737, 7, 119, 2, 2, 737, 738, 7, 118, 2, 2, 738, 739, 7, 117, 2, 2, 739, 740, 7, 48, 2, 2, 740, 741, 7, 110, 2, 2, 741, 742, 7, 103, 2, 2, 742, 743, 7, 112, 2, 2, 743, 744, 7, 105, 2, 2, 744, 745, 7, 118, 2, 2, 745, 768, 7, 106, 2, 2, 746, 747, 7, 118, 2, 2, 747, 748, 7, 122, 2, 2, 748, 749, 7, 48, 2, 2, 749, 750, 7, 120, 2, 2, 750, 751, 7, 103, 2, 2, 751, 752, 7, 116, 2, 2, 752, 753, 7, 117, 2, 2, 753, 754, 7, 107, 2, 2, 754, 755, 7, 113, 2, 2, 755, 768, 7, 112, 2, 2, 756, 757, 7, 118, 2, 2, 757, 758, 7, 122, 2, 2, 758, 759, 7, 48, 2, 2, 759, 760, 7, 110, 2, 2, 760, 761, 7, 113, 2, 2, 761, 762, 7, 101, 2, 2, 762, 763, 7, 109, 2, 2, 763, 764, 7, 118, 2, 2, 764, 765, 7, 107, 2, 2, 765, 766, 7, 111, 2, 2, 766, 768, 7, 103, 2, 2, 767, 673, 3, 2, 2, 2, 767, 694, 3, 2, 2, 2, 767, 713, 3, 2, 2, 2, 767, 729, 3, 2, 2, 2, 767, 746, 3, 2, 2, 2, 767, 756, 3, 2, 2, 2, 768, 136, 3, 2, 2, 2, 769, 773, 9, 10, 2, 2, 770, 772, 9, 11, 2, 2, 771, 770, 3, 2, 2, 2, 772, 775, 3, 2, 2, 2, 773, 771, 3, 2, 2, 2, 773, 774, 3, 2, 2, 2, 774, 138, 3, 2, 2, 2, 775, 773, 3, 2, 2, 2, 776, 778, 9, 12, 2, 2, 777, 776, 3, 2, 2, 2, 778, 779, 3, 2, 2, 2, 779, 777, 3, 2, 2, 2, 779, 780, 3, 2, 2, 2, 780, 781, 3, 2, 2, 2, 781, 782, 8, 70, 2, 2, 782, 140, 3, 2, 2, 2, 783, 784, 7, 49, 2, 2, 784, 785, 7, 44, 2, 2, 785, 789, 3, 2, 2, 2, 786, 788, 11, 2, 2, 2, 787, 786, 3, 2, 2, 2, 788, 791, 3, 2, 2, 2, 789, 790, 3, 2, 2, 2, 789, 787, 3, 2, 2, 2, 790, 792, 3, 2, 2, 2, 791, 789, 3, 2, 2, 2, 792, 793, 7, 44, 2, 2, 793, 794, 7, 49, 2, 2, 794, 795, 3, 2, 2, 2, 795, 796, 8, 71, 3, 2, 796, 142, 3, 2, 2, 2, 797, 798, 7, 49, 2, 2, 798, 799, 7, 49, 2, 2, 799, 803, 3, 2, 2, 2, 800, 802, 10, 13, 2, 2, 801, 800, 3, 2, 2, 2, 802, 805, 3, 2, 2, 2, 803, 801, 3, 2, 2, 2, 803, 804, 3, 2, 2, 2, 804, 806, 3, 2, 2, 2, 805, 803, 3, 2, 2, 2, 806, 807, 8, 72, 3, 2, 807, 144, 3, 2, 2, 2, 27, 2, 497, 503, 509, 520, 579, 582, 587, 593, 595, 604, 610, 616, 623, 625, 633, 635, 639, 655, 671, 767, 773, 779, 789, 803, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[4, 0, 71, 806, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 4, 56, 494, 8, 56, 11, 56, 12, 56, 495, 1, 56, 1, 56, 4, 56, 500, 8, 56, 11, 56, 12, 56, 501, 1, 56, 1, 56, 4, 56, 506, 8, 56, 11, 56, 12, 56, 507, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 519, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 578, 8, 58, 1, 59, 3, 59, 581, 8, 59, 1, 59, 4, 59, 584, 8, 59, 11, 59, 12, 59, 585, 1, 59, 1, 59, 4, 59, 590, 8, 59, 11, 59, 12, 59, 591, 3, 59, 594, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 603, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 609, 8, 60, 1, 61, 1, 61, 5, 61, 613, 8, 61, 10, 61, 12, 61, 616, 9, 61, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 622, 8, 62, 10, 62, 12, 62, 625, 9, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 632, 8, 62, 10, 62, 12, 62, 635, 9, 62, 1, 62, 3, 62, 638, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 652, 8, 64, 10, 64, 12, 64, 655, 9, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 670, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 766, 8, 66, 1, 67, 1, 67, 5, 67, 770, 8, 67, 10, 67, 12, 67, 773, 9, 67, 1, 68, 4, 68, 776, 8, 68, 11, 68, 12, 68, 777, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 786, 8, 69, 10, 69, 12, 69, 789, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 800, 8, 70, 10, 70, 12, 70, 803, 9, 70, 1, 70, 1, 70, 3, 623, 633, 787, 0, 71, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 1, 0, 12, 1, 0, 48, 57, 1, 0, 45, 45, 2, 0, 69, 69, 101, 101, 1, 0, 49, 57, 3, 0, 10, 10, 13, 13, 34, 34, 3, 0, 10, 10, 13, 13, 39, 39, 2, 0, 88, 88, 120, 120, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 65, 90, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 841, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 1, 143, 1, 0, 0, 0, 3, 150, 1, 0, 0, 0, 5, 152, 1, 0, 0, 0, 7, 163, 1, 0, 0, 0, 9, 165, 1, 0, 0, 0, 11, 167, 1, 0, 0, 0, 13, 170, 1, 0, 0, 0, 15, 172, 1, 0, 0, 0, 17, 174, 1, 0, 0, 0, 19, 177, 1, 0, 0, 0, 21, 179, 1, 0, 0, 0, 23, 188, 1, 0, 0, 0, 25, 190, 1, 0, 0, 0, 27, 192, 1, 0, 0, 0, 29, 201, 1, 0, 0, 0, 31, 203, 1, 0, 0, 0, 33, 205, 1, 0, 0, 0, 35, 207, 1, 0, 0, 0, 37, 215, 1, 0, 0, 0, 39, 218, 1, 0, 0, 0, 41, 223, 1, 0, 0, 0, 43, 227, 1, 0, 0, 0, 45, 229, 1, 0, 0, 0, 47, 231, 1, 0, 0, 0, 49, 242, 1, 0, 0, 0, 51, 249, 1, 0, 0, 0, 53, 266, 1, 0, 0, 0, 55, 281, 1, 0, 0, 0, 57, 296, 1, 0, 0, 0, 59, 309, 1, 0, 0, 0, 61, 319, 1, 0, 0, 0, 63, 344, 1, 0, 0, 0, 65, 359, 1, 0, 0, 0, 67, 378, 1, 0, 0, 0, 69, 394, 1, 0, 0, 0, 71, 405, 1, 0, 0, 0, 73, 413, 1, 0, 0, 0, 75, 420, 1, 0, 0, 0, 77, 422, 1, 0, 0, 0, 79, 424, 1, 0, 0, 0, 81, 426, 1, 0, 0, 0, 83, 428, 1, 0, 0, 0, 85, 430, 1, 0, 0, 0, 87, 432, 1, 0, 0, 0, 89, 435, 1, 0, 0, 0, 91, 438, 1, 0, 0, 0, 93, 440, 1, 0, 0, 0, 95, 442, 1, 0, 0, 0, 97, 445, 1, 0, 0, 0, 99, 448, 1, 0, 0, 0, 101, 457, 1, 0, 0, 0, 103, 461, 1, 0, 0, 0, 105, 466, 1, 0, 0, 0, 107, 473, 1, 0, 0, 0, 109, 480, 1, 0, 0, 0, 111, 484, 1, 0, 0, 0, 113, 493, 1, 0, 0, 0, 115, 518, 1, 0, 0, 0, 117, 577, 1, 0, 0, 0, 119, 580, 1, 0, 0, 0, 121, 608, 1, 0, 0, 0, 123, 610, 1, 0, 0, 0, 125, 637, 1, 0, 0, 0, 127, 639, 1, 0, 0, 0, 129, 648, 1, 0, 0, 0, 131, 669, 1, 0, 0, 0, 133, 765, 1, 0, 0, 0, 135, 767, 1, 0, 0, 0, 137, 775, 1, 0, 0, 0, 139, 781, 1, 0, 0, 0, 141, 795, 1, 0, 0, 0, 143, 144, 5, 112, 0, 0, 144, 145, 5, 114, 0, 0, 145, 146, 5, 97, 0, 0, 146, 147, 5, 103, 0, 0, 147, 148, 5, 109, 0, 0, 148, 149, 5, 97, 0, 0, 149, 2, 1, 0, 0, 0, 150, 151, 5, 59, 0, 0, 151, 4, 1, 0, 0, 0, 152, 153, 5, 99, 0, 0, 153, 154, 5, 97, 0, 0, 154, 155, 5, 115, 0, 0, 155, 156, 5, 104, 0, 0, 156, 157, 5, 115, 0, 0, 157, 158, 5, 99, 0, 0, 158, 159, 5, 114, 0, 0, 159, 160, 5, 105, 0, 0, 160, 161, 5, 112, 0, 0, 161, 162, 5, 116, 0, 0, 162, 6, 1, 0, 0, 0, 163, 164, 5, 94, 0, 0, 164, 8, 1, 0, 0, 0, 165, 166, 5, 126, 0, 0, 166, 10, 1, 0, 0, 0, 167, 168, 5, 62, 0, 0, 168, 169, 5, 61, 0, 0, 169, 12, 1, 0, 0, 0, 170, 171, 5, 62, 0, 0, 171, 14, 1, 0, 0, 0, 172, 173, 5, 60, 0, 0, 173, 16, 1, 0, 0, 0, 174, 175, 5, 60, 0, 0, 175, 176, 5, 61, 0, 0, 176, 18, 1, 0, 0, 0, 177, 178, 5, 61, 0, 0, 178, 20, 1, 0, 0, 0, 179, 180, 5, 99, 0, 0, 180, 181, 5, 111, 0, 0, 181, 182, 5, 110, 0, 0, 182, 183, 5, 116, 0, 0, 183, 184, 5, 114, 0, 0, 184, 185, 5, 97, 0, 0, 185, 186, 5, 99, 0, 0, 186, 187, 5, 116, 0, 0, 187, 22, 1, 0, 0, 0, 188, 189, 5, 123, 0, 0, 189, 24, 1, 0, 0, 0, 190, 191, 5, 125, 0, 0, 191, 26, 1, 0, 0, 0, 192, 193, 5, 102, 0, 0, 193, 194, 5, 117, 0, 0, 194, 195, 5, 110, 0, 0, 195, 196, 5, 99, 0, 0, 196, 197, 5, 116, 0, 0, 197, 198, 5, 105, 0, 0, 198, 199, 5, 111, 0, 0, 199, 200, 5, 110, 0, 0, 200, 28, 1, 0, 0, 0, 201, 202, 5, 40, 0, 0, 202, 30, 1, 0, 0, 0, 203, 204, 5, 44, 0, 0, 204, 32, 1, 0, 0, 0, 205, 206, 5, 41, 0, 0, 206, 34, 1, 0, 0, 0, 207, 208, 5, 114, 0, 0, 208, 209, 5, 101, 0, 0, 209, 210, 5, 113, 0, 0, 210, 211, 5, 117, 0, 0, 211, 212, 5, 105, 0, 0, 212, 213, 5, 114, 0, 0, 213, 214, 5, 101, 0, 0, 214, 36, 1, 0, 0, 0, 215, 216, 5, 105, 0, 0, 216, 217, 5, 102, 0, 0, 217, 38, 1, 0, 0, 0, 218, 219, 5, 101, 0, 0, 219, 220, 5, 108, 0, 0, 220, 221, 5, 115, 0, 0, 221, 222, 5, 101, 0, 0, 222, 40, 1, 0, 0, 0, 223, 224, 5, 110, 0, 0, 224, 225, 5, 101, 0, 0, 225, 226, 5, 119, 0, 0, 226, 42, 1, 0, 0, 0, 227, 228, 5, 91, 0, 0, 228, 44, 1, 0, 0, 0, 229, 230, 5, 93, 0, 0, 230, 46, 1, 0, 0, 0, 231, 232, 5, 116, 0, 0, 232, 233, 5, 120, 0, 0, 233, 234, 5, 46, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 117, 0, 0, 236, 237, 5, 116, 0, 0, 237, 238, 5, 112, 0, 0, 238, 239, 5, 117, 0, 0, 239, 240, 5, 116, 0, 0, 240, 241, 5, 115, 0, 0, 241, 48, 1, 0, 0, 0, 242, 243, 5, 46, 0, 0, 243, 244, 5, 118, 0, 0, 244, 245, 5, 97, 0, 0, 245, 246, 5, 108, 0, 0, 246, 247, 5, 117, 0, 0, 247, 248, 5, 101, 0, 0, 248, 50, 1, 0, 0, 0, 249, 250, 5, 46, 0, 0, 250, 251, 5, 108, 0, 0, 251, 252, 5, 111, 0, 0, 252, 253, 5, 99, 0, 0, 253, 254, 5, 107, 0, 0, 254, 255, 5, 105, 0, 0, 255, 256, 5, 110, 0, 0, 256, 257, 5, 103, 0, 0, 257, 258, 5, 66, 0, 0, 258, 259, 5, 121, 0, 0, 259, 260, 5, 116, 0, 0, 260, 261, 5, 101, 0, 0, 261, 262, 5, 99, 0, 0, 262, 263, 5, 111, 0, 0, 263, 264, 5, 100, 0, 0, 264, 265, 5, 101, 0, 0, 265, 52, 1, 0, 0, 0, 266, 267, 5, 46, 0, 0, 267, 268, 5, 116, 0, 0, 268, 269, 5, 111, 0, 0, 269, 270, 5, 107, 0, 0, 270, 271, 5, 101, 0, 0, 271, 272, 5, 110, 0, 0, 272, 273, 5, 67, 0, 0, 273, 274, 5, 97, 0, 0, 274, 275, 5, 116, 0, 0, 275, 276, 5, 101, 0, 0, 276, 277, 5, 103, 0, 0, 277, 278, 5, 111, 0, 0, 278, 279, 5, 114, 0, 0, 279, 280, 5, 121, 0, 0, 280, 54, 1, 0, 0, 0, 281, 282, 5, 46, 0, 0, 282, 283, 5, 110, 0, 0, 283, 284, 5, 102, 0, 0, 284, 285, 5, 116, 0, 0, 285, 286, 5, 67, 0, 0, 286, 287, 5, 111, 0, 0, 287, 288, 5, 109, 0, 0, 288, 289, 5, 109, 0, 0, 289, 290, 5, 105, 0, 0, 290, 291, 5, 116, 0, 0, 291, 292, 5, 109, 0, 0, 292, 293, 5, 101, 0, 0, 293, 294, 5, 110, 0, 0, 294, 295, 5, 116, 0, 0, 295, 56, 1, 0, 0, 0, 296, 297, 5, 46, 0, 0, 297, 298, 5, 116, 0, 0, 298, 299, 5, 111, 0, 0, 299, 300, 5, 107, 0, 0, 300, 301, 5, 101, 0, 0, 301, 302, 5, 110, 0, 0, 302, 303, 5, 65, 0, 0, 303, 304, 5, 109, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 117, 0, 0, 306, 307, 5, 110, 0, 0, 307, 308, 5, 116, 0, 0, 308, 58, 1, 0, 0, 0, 309, 310, 5, 116, 0, 0, 310, 311, 5, 120, 0, 0, 311, 312, 5, 46, 0, 0, 312, 313, 5, 105, 0, 0, 313, 314, 5, 110, 0, 0, 314, 315, 5, 112, 0, 0, 315, 316, 5, 117, 0, 0, 316, 317, 5, 116, 0, 0, 317, 318, 5, 115, 0, 0, 318, 60, 1, 0, 0, 0, 319, 320, 5, 46, 0, 0, 320, 321, 5, 111, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, 116, 0, 0, 323, 324, 5, 112, 0, 0, 324, 325, 5, 111, 0, 0, 325, 326, 5, 105, 0, 0, 326, 327, 5, 110, 0, 0, 327, 328, 5, 116, 0, 0, 328, 329, 5, 84, 0, 0, 329, 330, 5, 114, 0, 0, 330, 331, 5, 97, 0, 0, 331, 332, 5, 110, 0, 0, 332, 333, 5, 115, 0, 0, 333, 334, 5, 97, 0, 0, 334, 335, 5, 99, 0, 0, 335, 336, 5, 116, 0, 0, 336, 337, 5, 105, 0, 0, 337, 338, 5, 111, 0, 0, 338, 339, 5, 110, 0, 0, 339, 340, 5, 72, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 115, 0, 0, 342, 343, 5, 104, 0, 0, 343, 62, 1, 0, 0, 0, 344, 345, 5, 46, 0, 0, 345, 346, 5, 111, 0, 0, 346, 347, 5, 117, 0, 0, 347, 348, 5, 116, 0, 0, 348, 349, 5, 112, 0, 0, 349, 350, 5, 111, 0, 0, 350, 351, 5, 105, 0, 0, 351, 352, 5, 110, 0, 0, 352, 353, 5, 116, 0, 0, 353, 354, 5, 73, 0, 0, 354, 355, 5, 110, 0, 0, 355, 356, 5, 100, 0, 0, 356, 357, 5, 101, 0, 0, 357, 358, 5, 120, 0, 0, 358, 64, 1, 0, 0, 0, 359, 360, 5, 46, 0, 0, 360, 361, 5, 117, 0, 0, 361, 362, 5, 110, 0, 0, 362, 363, 5, 108, 0, 0, 363, 364, 5, 111, 0, 0, 364, 365, 5, 99, 0, 0, 365, 366, 5, 107, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 110, 0, 0, 368, 369, 5, 103, 0, 0, 369, 370, 5, 66, 0, 0, 370, 371, 5, 121, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 101, 0, 0, 373, 374, 5, 99, 0, 0, 374, 375, 5, 111, 0, 0, 375, 376, 5, 100, 0, 0, 376, 377, 5, 101, 0, 0, 377, 66, 1, 0, 0, 0, 378, 379, 5, 46, 0, 0, 379, 380, 5, 115, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 113, 0, 0, 382, 383, 5, 117, 0, 0, 383, 384, 5, 101, 0, 0, 384, 385, 5, 110, 0, 0, 385, 386, 5, 99, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 78, 0, 0, 388, 389, 5, 117, 0, 0, 389, 390, 5, 109, 0, 0, 390, 391, 5, 98, 0, 0, 391, 392, 5, 101, 0, 0, 392, 393, 5, 114, 0, 0, 393, 68, 1, 0, 0, 0, 394, 395, 5, 46, 0, 0, 395, 396, 5, 114, 0, 0, 396, 397, 5, 101, 0, 0, 397, 398, 5, 118, 0, 0, 398, 399, 5, 101, 0, 0, 399, 400, 5, 114, 0, 0, 400, 401, 5, 115, 0, 0, 401, 402, 5, 101, 0, 0, 402, 403, 5, 40, 0, 0, 403, 404, 5, 41, 0, 0, 404, 70, 1, 0, 0, 0, 405, 406, 5, 46, 0, 0, 406, 407, 5, 108, 0, 0, 407, 408, 5, 101, 0, 0, 408, 409, 5, 110, 0, 0, 409, 410, 5, 103, 0, 0, 410, 411, 5, 116, 0, 0, 411, 412, 5, 104, 0, 0, 412, 72, 1, 0, 0, 0, 413, 414, 5, 46, 0, 0, 414, 415, 5, 115, 0, 0, 415, 416, 5, 112, 0, 0, 416, 417, 5, 108, 0, 0, 417, 418, 5, 105, 0, 0, 418, 419, 5, 116, 0, 0, 419, 74, 1, 0, 0, 0, 420, 421, 5, 33, 0, 0, 421, 76, 1, 0, 0, 0, 422, 423, 5, 45, 0, 0, 423, 78, 1, 0, 0, 0, 424, 425, 5, 42, 0, 0, 425, 80, 1, 0, 0, 0, 426, 427, 5, 47, 0, 0, 427, 82, 1, 0, 0, 0, 428, 429, 5, 37, 0, 0, 429, 84, 1, 0, 0, 0, 430, 431, 5, 43, 0, 0, 431, 86, 1, 0, 0, 0, 432, 433, 5, 61, 0, 0, 433, 434, 5, 61, 0, 0, 434, 88, 1, 0, 0, 0, 435, 436, 5, 33, 0, 0, 436, 437, 5, 61, 0, 0, 437, 90, 1, 0, 0, 0, 438, 439, 5, 38, 0, 0, 439, 92, 1, 0, 0, 0, 440, 441, 5, 124, 0, 0, 441, 94, 1, 0, 0, 0, 442, 443, 5, 38, 0, 0, 443, 444, 5, 38, 0, 0, 444, 96, 1, 0, 0, 0, 445, 446, 5, 124, 0, 0, 446, 447, 5, 124, 0, 0, 447, 98, 1, 0, 0, 0, 448, 449, 5, 99, 0, 0, 449, 450, 5, 111, 0, 0, 450, 451, 5, 110, 0, 0, 451, 452, 5, 115, 0, 0, 452, 453, 5, 116, 0, 0, 453, 454, 5, 97, 0, 0, 454, 455, 5, 110, 0, 0, 455, 456, 5, 116, 0, 0, 456, 100, 1, 0, 0, 0, 457, 458, 5, 105, 0, 0, 458, 459, 5, 110, 0, 0, 459, 460, 5, 116, 0, 0, 460, 102, 1, 0, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 111, 0, 0, 463, 464, 5, 111, 0, 0, 464, 465, 5, 108, 0, 0, 465, 104, 1, 0, 0, 0, 466, 467, 5, 115, 0, 0, 467, 468, 5, 116, 0, 0, 468, 469, 5, 114, 0, 0, 469, 470, 5, 105, 0, 0, 470, 471, 5, 110, 0, 0, 471, 472, 5, 103, 0, 0, 472, 106, 1, 0, 0, 0, 473, 474, 5, 112, 0, 0, 474, 475, 5, 117, 0, 0, 475, 476, 5, 98, 0, 0, 476, 477, 5, 107, 0, 0, 477, 478, 5, 101, 0, 0, 478, 479, 5, 121, 0, 0, 479, 108, 1, 0, 0, 0, 480, 481, 5, 115, 0, 0, 481, 482, 5, 105, 0, 0, 482, 483, 5, 103, 0, 0, 483, 110, 1, 0, 0, 0, 484, 485, 5, 100, 0, 0, 485, 486, 5, 97, 0, 0, 486, 487, 5, 116, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 115, 0, 0, 489, 490, 5, 105, 0, 0, 490, 491, 5, 103, 0, 0, 491, 112, 1, 0, 0, 0, 492, 494, 7, 0, 0, 0, 493, 492, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 499, 5, 46, 0, 0, 498, 500, 7, 0, 0, 0, 499, 498, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 499, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 505, 5, 46, 0, 0, 504, 506, 7, 0, 0, 0, 505, 504, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 114, 1, 0, 0, 0, 509, 510, 5, 116, 0, 0, 510, 511, 5, 114, 0, 0, 511, 512, 5, 117, 0, 0, 512, 519, 5, 101, 0, 0, 513, 514, 5, 102, 0, 0, 514, 515, 5, 97, 0, 0, 515, 516, 5, 108, 0, 0, 516, 517, 5, 115, 0, 0, 517, 519, 5, 101, 0, 0, 518, 509, 1, 0, 0, 0, 518, 513, 1, 0, 0, 0, 519, 116, 1, 0, 0, 0, 520, 521, 5, 115, 0, 0, 521, 522, 5, 97, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 111, 0, 0, 524, 525, 5, 115, 0, 0, 525, 526, 5, 104, 0, 0, 526, 527, 5, 105, 0, 0, 527, 578, 5, 115, 0, 0, 528, 529, 5, 115, 0, 0, 529, 530, 5, 97, 0, 0, 530, 531, 5, 116, 0, 0, 531, 578, 5, 115, 0, 0, 532, 533, 5, 102, 0, 0, 533, 534, 5, 105, 0, 0, 534, 535, 5, 110, 0, 0, 535, 536, 5, 110, 0, 0, 536, 537, 5, 101, 0, 0, 537, 578, 5, 121, 0, 0, 538, 539, 5, 98, 0, 0, 539, 540, 5, 105, 0, 0, 540, 541, 5, 116, 0, 0, 541, 578, 5, 115, 0, 0, 542, 543, 5, 98, 0, 0, 543, 544, 5, 105, 0, 0, 544, 545, 5, 116, 0, 0, 545, 546, 5, 99, 0, 0, 546, 547, 5, 111, 0, 0, 547, 548, 5, 105, 0, 0, 548, 578, 5, 110, 0, 0, 549, 550, 5, 115, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 99, 0, 0, 552, 553, 5, 111, 0, 0, 553, 554, 5, 110, 0, 0, 554, 555, 5, 100, 0, 0, 555, 578, 5, 115, 0, 0, 556, 557, 5, 109, 0, 0, 557, 558, 5, 105, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 116, 0, 0, 561, 562, 5, 101, 0, 0, 562, 578, 5, 115, 0, 0, 563, 564, 5, 104, 0, 0, 564, 565, 5, 111, 0, 0, 565, 566, 5, 117, 0, 0, 566, 567, 5, 114, 0, 0, 567, 578, 5, 115, 0, 0, 568, 569, 5, 100, 0, 0, 569, 570, 5, 97, 0, 0, 570, 571, 5, 121, 0, 0, 571, 578, 5, 115, 0, 0, 572, 573, 5, 119, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 101, 0, 0, 575, 576, 5, 107, 0, 0, 576, 578, 5, 115, 0, 0, 577, 520, 1, 0, 0, 0, 577, 528, 1, 0, 0, 0, 577, 532, 1, 0, 0, 0, 577, 538, 1, 0, 0, 0, 577, 542, 1, 0, 0, 0, 577, 549, 1, 0, 0, 0, 577, 556, 1, 0, 0, 0, 577, 563, 1, 0, 0, 0, 577, 568, 1, 0, 0, 0, 577, 572, 1, 0, 0, 0, 578, 118, 1, 0, 0, 0, 579, 581, 7, 1, 0, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 583, 1, 0, 0, 0, 582, 584, 7, 0, 0, 0, 583, 582, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 593, 1, 0, 0, 0, 587, 589, 7, 2, 0, 0, 588, 590, 7, 0, 0, 0, 589, 588, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 589, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 594, 1, 0, 0, 0, 593, 587, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 120, 1, 0, 0, 0, 595, 596, 5, 98, 0, 0, 596, 597, 5, 121, 0, 0, 597, 598, 5, 116, 0, 0, 598, 599, 5, 101, 0, 0, 599, 600, 5, 115, 0, 0, 600, 602, 1, 0, 0, 0, 601, 603, 3, 123, 61, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 609, 1, 0, 0, 0, 604, 605, 5, 98, 0, 0, 605, 606, 5, 121, 0, 0, 606, 607, 5, 116, 0, 0, 607, 609, 5, 101, 0, 0, 608, 595, 1, 0, 0, 0, 608, 604, 1, 0, 0, 0, 609, 122, 1, 0, 0, 0, 610, 614, 7, 3, 0, 0, 611, 613, 7, 0, 0, 0, 612, 611, 1, 0, 0, 0, 613, 616, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 124, 1, 0, 0, 0, 616, 614, 1, 0, 0, 0, 617, 623, 5, 34, 0, 0, 618, 619, 5, 92, 0, 0, 619, 622, 5, 34, 0, 0, 620, 622, 8, 4, 0, 0, 621, 618, 1, 0, 0, 0, 621, 620, 1, 0, 0, 0, 622, 625, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 623, 621, 1, 0, 0, 0, 624, 626, 1, 0, 0, 0, 625, 623, 1, 0, 0, 0, 626, 638, 5, 34, 0, 0, 627, 633, 5, 39, 0, 0, 628, 629, 5, 92, 0, 0, 629, 632, 5, 39, 0, 0, 630, 632, 8, 5, 0, 0, 631, 628, 1, 0, 0, 0, 631, 630, 1, 0, 0, 0, 632, 635, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 636, 638, 5, 39, 0, 0, 637, 617, 1, 0, 0, 0, 637, 627, 1, 0, 0, 0, 638, 126, 1, 0, 0, 0, 639, 640, 5, 100, 0, 0, 640, 641, 5, 97, 0, 0, 641, 642, 5, 116, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 40, 0, 0, 644, 645, 1, 0, 0, 0, 645, 646, 3, 125, 62, 0, 646, 647, 5, 41, 0, 0, 647, 128, 1, 0, 0, 0, 648, 649, 5, 48, 0, 0, 649, 653, 7, 6, 0, 0, 650, 652, 7, 7, 0, 0, 651, 650, 1, 0, 0, 0, 652, 655, 1, 0, 0, 0, 653, 651, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 130, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 656, 657, 5, 116, 0, 0, 657, 658, 5, 120, 0, 0, 658, 659, 5, 46, 0, 0, 659, 660, 5, 97, 0, 0, 660, 661, 5, 103, 0, 0, 661, 670, 5, 101, 0, 0, 662, 663, 5, 116, 0, 0, 663, 664, 5, 120, 0, 0, 664, 665, 5, 46, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 105, 0, 0, 667, 668, 5, 109, 0, 0, 668, 670, 5, 101, 0, 0, 669, 656, 1, 0, 0, 0, 669, 662, 1, 0, 0, 0, 670, 132, 1, 0, 0, 0, 671, 672, 5, 116, 0, 0, 672, 673, 5, 104, 0, 0, 673, 674, 5, 105, 0, 0, 674, 675, 5, 115, 0, 0, 675, 676, 5, 46, 0, 0, 676, 677, 5, 97, 0, 0, 677, 678, 5, 99, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 105, 0, 0, 680, 681, 5, 118, 0, 0, 681, 682, 5, 101, 0, 0, 682, 683, 5, 73, 0, 0, 683, 684, 5, 110, 0, 0, 684, 685, 5, 112, 0, 0, 685, 686, 5, 117, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 73, 0, 0, 688, 689, 5, 110, 0, 0, 689, 690, 5, 100, 0, 0, 690, 691, 5, 101, 0, 0, 691, 766, 5, 120, 0, 0, 692, 693, 5, 116, 0, 0, 693, 694, 5, 104, 0, 0, 694, 695, 5, 105, 0, 0, 695, 696, 5, 115, 0, 0, 696, 697, 5, 46, 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 99, 0, 0, 699, 700, 5, 116, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 118, 0, 0, 702, 703, 5, 101, 0, 0, 703, 704, 5, 66, 0, 0, 704, 705, 5, 121, 0, 0, 705, 706, 5, 116, 0, 0, 706, 707, 5, 101, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 111, 0, 0, 709, 710, 5, 100, 0, 0, 710, 766, 5, 101, 0, 0, 711, 712, 5, 116, 0, 0, 712, 713, 5, 120, 0, 0, 713, 714, 5, 46, 0, 0, 714, 715, 5, 105, 0, 0, 715, 716, 5, 110, 0, 0, 716, 717, 5, 112, 0, 0, 717, 718, 5, 117, 0, 0, 718, 719, 5, 116, 0, 0, 719, 720, 5, 115, 0, 0, 720, 721, 5, 46, 0, 0, 721, 722, 5, 108, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, 110, 0, 0, 724, 725, 5, 103, 0, 0, 725, 726, 5, 116, 0, 0, 726, 766, 5, 104, 0, 0, 727, 728, 5, 116, 0, 0, 728, 729, 5, 120, 0, 0, 729, 730, 5, 46, 0, 0, 730, 731, 5, 111, 0, 0, 731, 732, 5, 117, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 112, 0, 0, 734, 735, 5, 117, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 115, 0, 0, 737, 738, 5, 46, 0, 0, 738, 739, 5, 108, 0, 0, 739, 740, 5, 101, 0, 0, 740, 741, 5, 110, 0, 0, 741, 742, 5, 103, 0, 0, 742, 743, 5, 116, 0, 0, 743, 766, 5, 104, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 120, 0, 0, 746, 747, 5, 46, 0, 0, 747, 748, 5, 118, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 115, 0, 0, 751, 752, 5, 105, 0, 0, 752, 753, 5, 111, 0, 0, 753, 766, 5, 110, 0, 0, 754, 755, 5, 116, 0, 0, 755, 756, 5, 120, 0, 0, 756, 757, 5, 46, 0, 0, 757, 758, 5, 108, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 99, 0, 0, 760, 761, 5, 107, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 105, 0, 0, 763, 764, 5, 109, 0, 0, 764, 766, 5, 101, 0, 0, 765, 671, 1, 0, 0, 0, 765, 692, 1, 0, 0, 0, 765, 711, 1, 0, 0, 0, 765, 727, 1, 0, 0, 0, 765, 744, 1, 0, 0, 0, 765, 754, 1, 0, 0, 0, 766, 134, 1, 0, 0, 0, 767, 771, 7, 8, 0, 0, 768, 770, 7, 9, 0, 0, 769, 768, 1, 0, 0, 0, 770, 773, 1, 0, 0, 0, 771, 769, 1, 0, 0, 0, 771, 772, 1, 0, 0, 0, 772, 136, 1, 0, 0, 0, 773, 771, 1, 0, 0, 0, 774, 776, 7, 10, 0, 0, 775, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 779, 1, 0, 0, 0, 779, 780, 6, 68, 0, 0, 780, 138, 1, 0, 0, 0, 781, 782, 5, 47, 0, 0, 782, 783, 5, 42, 0, 0, 783, 787, 1, 0, 0, 0, 784, 786, 9, 0, 0, 0, 785, 784, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 788, 1, 0, 0, 0, 787, 785, 1, 0, 0, 0, 788, 790, 1, 0, 0, 0, 789, 787, 1, 0, 0, 0, 790, 791, 5, 42, 0, 0, 791, 792, 5, 47, 0, 0, 792, 793, 1, 0, 0, 0, 793, 794, 6, 69, 1, 0, 794, 140, 1, 0, 0, 0, 795, 796, 5, 47, 0, 0, 796, 797, 5, 47, 0, 0, 797, 801, 1, 0, 0, 0, 798, 800, 8, 11, 0, 0, 799, 798, 1, 0, 0, 0, 800, 803, 1, 0, 0, 0, 801, 799, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 804, 1, 0, 0, 0, 803, 801, 1, 0, 0, 0, 804, 805, 6, 70, 1, 0, 805, 142, 1, 0, 0, 0, 25, 0, 495, 501, 507, 518, 577, 580, 585, 591, 593, 602, 608, 614, 621, 623, 631, 633, 637, 653, 669, 765, 771, 777, 787, 801, 2, 6, 0, 0, 0, 1, 0] \ No newline at end of file diff --git a/packages/cashc/src/grammar/CashScriptLexer.ts b/packages/cashc/src/grammar/CashScriptLexer.ts index 43c82253..5fc6f298 100644 --- a/packages/cashc/src/grammar/CashScriptLexer.ts +++ b/packages/cashc/src/grammar/CashScriptLexer.ts @@ -1,21 +1,17 @@ -// Generated from src/grammar/CashScript.g4 by ANTLR 4.9.0-SNAPSHOT - - -import { ATN } from "antlr4ts/atn/ATN.js"; -import { ATNDeserializer } from "antlr4ts/atn/ATNDeserializer.js"; -import { CharStream } from "antlr4ts/CharStream.js"; -import { Lexer } from "antlr4ts/Lexer.js"; -import { LexerATNSimulator } from "antlr4ts/atn/LexerATNSimulator.js"; -import { NotNull } from "antlr4ts/Decorators.js"; -import { Override } from "antlr4ts/Decorators.js"; -import { RuleContext } from "antlr4ts/RuleContext.js"; -import { Vocabulary } from "antlr4ts/Vocabulary.js"; -import { VocabularyImpl } from "antlr4ts/VocabularyImpl.js"; - -import * as Utils from "antlr4ts/misc/Utils.js"; - - -export class CashScriptLexer extends Lexer { +// Generated from src/grammar/CashScript.g4 by ANTLR 4.13.1 +// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols +import { + ATN, + ATNDeserializer, + CharStream, + DecisionState, DFA, + Lexer, + LexerATNSimulator, + RuleContext, + PredictionContextCache, + Token +} from "antlr4"; +export default class CashScriptLexer extends Lexer { public static readonly T__0 = 1; public static readonly T__1 = 2; public static readonly T__2 = 3; @@ -87,16 +83,88 @@ export class CashScriptLexer extends Lexer { public static readonly WHITESPACE = 69; public static readonly COMMENT = 70; public static readonly LINE_COMMENT = 71; + public static readonly EOF = Token.EOF; - // tslint:disable:no-trailing-whitespace - public static readonly channelNames: string[] = [ - "DEFAULT_TOKEN_CHANNEL", "HIDDEN", - ]; - - // tslint:disable:no-trailing-whitespace - public static readonly modeNames: string[] = [ - "DEFAULT_MODE", - ]; + public static readonly channelNames: string[] = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; + public static readonly literalNames: (string | null)[] = [ null, "'pragma'", + "';'", "'cashscript'", + "'^'", "'~'", + "'>='", "'>'", + "'<'", "'<='", + "'='", "'contract'", + "'{'", "'}'", + "'function'", + "'('", "','", + "')'", "'require'", + "'if'", "'else'", + "'new'", "'['", + "']'", "'tx.outputs'", + "'.value'", + "'.lockingBytecode'", + "'.tokenCategory'", + "'.nftCommitment'", + "'.tokenAmount'", + "'tx.inputs'", + "'.outpointTransactionHash'", + "'.outpointIndex'", + "'.unlockingBytecode'", + "'.sequenceNumber'", + "'.reverse()'", + "'.length'", + "'.split'", + "'!'", "'-'", + "'*'", "'/'", + "'%'", "'+'", + "'=='", "'!='", + "'&'", "'|'", + "'&&'", "'||'", + "'constant'", + "'int'", "'bool'", + "'string'", + "'pubkey'", + "'sig'", "'datasig'" ]; + public static readonly symbolicNames: (string | null)[] = [ null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, "VersionLiteral", + "BooleanLiteral", + "NumberUnit", + "NumberLiteral", + "Bytes", "Bound", + "StringLiteral", + "DateLiteral", + "HexLiteral", + "TxVar", "NullaryOp", + "Identifier", + "WHITESPACE", + "COMMENT", + "LINE_COMMENT" ]; + public static readonly modeNames: string[] = [ "DEFAULT_MODE", ]; public static readonly ruleNames: string[] = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", @@ -111,452 +179,299 @@ export class CashScriptLexer extends Lexer { "COMMENT", "LINE_COMMENT", ]; - private static readonly _LITERAL_NAMES: Array = [ - undefined, "'pragma'", "';'", "'cashscript'", "'^'", "'~'", "'>='", "'>'", - "'<'", "'<='", "'='", "'contract'", "'{'", "'}'", "'function'", "'('", - "','", "')'", "'require'", "'if'", "'else'", "'new'", "'['", "']'", "'tx.outputs'", - "'.value'", "'.lockingBytecode'", "'.tokenCategory'", "'.nftCommitment'", - "'.tokenAmount'", "'tx.inputs'", "'.outpointTransactionHash'", "'.outpointIndex'", - "'.unlockingBytecode'", "'.sequenceNumber'", "'.reverse()'", "'.length'", - "'.split'", "'!'", "'-'", "'*'", "'/'", "'%'", "'+'", "'=='", "'!='", - "'&'", "'|'", "'&&'", "'||'", "'constant'", "'int'", "'bool'", "'string'", - "'pubkey'", "'sig'", "'datasig'", - ]; - private static readonly _SYMBOLIC_NAMES: Array = [ - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, "VersionLiteral", "BooleanLiteral", "NumberUnit", "NumberLiteral", - "Bytes", "Bound", "StringLiteral", "DateLiteral", "HexLiteral", "TxVar", - "NullaryOp", "Identifier", "WHITESPACE", "COMMENT", "LINE_COMMENT", - ]; - public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(CashScriptLexer._LITERAL_NAMES, CashScriptLexer._SYMBOLIC_NAMES, []); - - // @Override - // @NotNull - public get vocabulary(): Vocabulary { - return CashScriptLexer.VOCABULARY; - } - // tslint:enable:no-trailing-whitespace - constructor(input: CharStream) { super(input); - this._interp = new LexerATNSimulator(CashScriptLexer._ATN, this); + this._interp = new LexerATNSimulator(this, CashScriptLexer._ATN, CashScriptLexer.DecisionsToDFA, new PredictionContextCache()); } - // @Override public get grammarFileName(): string { return "CashScript.g4"; } - // @Override + public get literalNames(): (string | null)[] { return CashScriptLexer.literalNames; } + public get symbolicNames(): (string | null)[] { return CashScriptLexer.symbolicNames; } public get ruleNames(): string[] { return CashScriptLexer.ruleNames; } - // @Override - public get serializedATN(): string { return CashScriptLexer._serializedATN; } + public get serializedATN(): number[] { return CashScriptLexer._serializedATN; } - // @Override public get channelNames(): string[] { return CashScriptLexer.channelNames; } - // @Override public get modeNames(): string[] { return CashScriptLexer.modeNames; } - private static readonly _serializedATNSegments: number = 2; - private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02I\u0328\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" + - "\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\'\x04(\t(\x04)\t)\x04*\t*\x04" + - "+\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\x04G\tG\x04H\tH\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03\x02\x03" + - "\x02\x03\x03\x03\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03" + - "\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x06\x03\x06\x03" + - "\x07\x03\x07\x03\x07\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\n\x03\v\x03" + - "\v\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\r\x03\r\x03" + - "\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\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\x03\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03" + - "\x14\x03\x15\x03\x15\x03\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x17\x03\x17\x03\x18\x03\x18\x03\x19\x03\x19\x03\x19\x03\x19\x03" + - "\x19\x03\x19\x03\x19\x03\x19\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\x1B\x03" + - "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03" + - "\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03\x1C\x03" + - "\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03" + - "\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03\x1E\x03" + - "\x1E\x03\x1E\x03\x1F\x03\x1F\x03\x1F\x03\x1F\x03\x1F\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!\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" + - "#\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%\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/\x030\x030\x031\x031\x031\x032\x032\x032\x033\x033\x03" + - "3\x033\x033\x033\x033\x033\x033\x034\x034\x034\x034\x035\x035\x035\x03" + - "5\x035\x036\x036\x036\x036\x036\x036\x036\x037\x037\x037\x037\x037\x03" + - "7\x037\x038\x038\x038\x038\x039\x039\x039\x039\x039\x039\x039\x039\x03" + - ":\x06:\u01F0\n:\r:\x0E:\u01F1\x03:\x03:\x06:\u01F6\n:\r:\x0E:\u01F7\x03" + - ":\x03:\x06:\u01FC\n:\r:\x0E:\u01FD\x03;\x03;\x03;\x03;\x03;\x03;\x03;" + - "\x03;\x03;\x05;\u0209\n;\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<\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<\x05<\u0244\n<\x03=\x05=\u0247\n=\x03=" + - "\x06=\u024A\n=\r=\x0E=\u024B\x03=\x03=\x06=\u0250\n=\r=\x0E=\u0251\x05" + - "=\u0254\n=\x03>\x03>\x03>\x03>\x03>\x03>\x03>\x05>\u025D\n>\x03>\x03>" + - "\x03>\x03>\x05>\u0263\n>\x03?\x03?\x07?\u0267\n?\f?\x0E?\u026A\v?\x03" + - "@\x03@\x03@\x03@\x07@\u0270\n@\f@\x0E@\u0273\v@\x03@\x03@\x03@\x03@\x03" + - "@\x07@\u027A\n@\f@\x0E@\u027D\v@\x03@\x05@\u0280\n@\x03A\x03A\x03A\x03" + - "A\x03A\x03A\x03A\x03A\x03A\x03B\x03B\x03B\x07B\u028E\nB\fB\x0EB\u0291" + - "\vB\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x03C\x05" + - "C\u02A0\nC\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03" + - "D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x03D\x05D\u0300" + - "\nD\x03E\x03E\x07E\u0304\nE\fE\x0EE\u0307\vE\x03F\x06F\u030A\nF\rF\x0E" + - "F\u030B\x03F\x03F\x03G\x03G\x03G\x03G\x07G\u0314\nG\fG\x0EG\u0317\vG\x03" + - "G\x03G\x03G\x03G\x03G\x03H\x03H\x03H\x03H\x07H\u0322\nH\fH\x0EH\u0325" + - "\vH\x03H\x03H\x05\u0271\u027B\u0315\x02\x02I\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\x8D\x02H\x8F\x02I\x03\x02\x0E\x03" + - "\x022;\x03\x02//\x04\x02GGgg\x03\x023;\x05\x02\f\f\x0F\x0F$$\x05\x02\f" + - "\f\x0F\x0F))\x04\x02ZZzz\x05\x022;CHch\x04\x02C\\c|\x06\x022;C\\aac|\x05" + - "\x02\v\f\x0E\x0F\"\"\x04\x02\f\f\x0F\x0F\x02\u034B\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\x02" + - "K\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\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\x02" + - "m\x03\x02\x02\x02\x02o\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\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\x02\x8F\x03\x02\x02\x02\x03\x91\x03\x02\x02\x02\x05" + - "\x98\x03\x02\x02\x02\x07\x9A\x03\x02\x02\x02\t\xA5\x03\x02\x02\x02\v\xA7" + - "\x03\x02\x02\x02\r\xA9\x03\x02\x02\x02\x0F\xAC\x03\x02\x02\x02\x11\xAE" + - "\x03\x02\x02\x02\x13\xB0\x03\x02\x02\x02\x15\xB3\x03\x02\x02\x02\x17\xB5" + - "\x03\x02\x02\x02\x19\xBE\x03\x02\x02\x02\x1B\xC0\x03\x02\x02\x02\x1D\xC2" + - "\x03\x02\x02\x02\x1F\xCB\x03\x02\x02\x02!\xCD\x03\x02\x02\x02#\xCF\x03" + - "\x02\x02\x02%\xD1\x03\x02\x02\x02\'\xD9\x03\x02\x02\x02)\xDC\x03\x02\x02" + - "\x02+\xE1\x03\x02\x02\x02-\xE5\x03\x02\x02\x02/\xE7\x03\x02\x02\x021\xE9" + - "\x03\x02\x02\x023\xF4\x03\x02\x02\x025\xFB\x03\x02\x02\x027\u010C\x03" + - "\x02\x02\x029\u011B\x03\x02\x02\x02;\u012A\x03\x02\x02\x02=\u0137\x03" + - "\x02\x02\x02?\u0141\x03\x02\x02\x02A\u015A\x03\x02\x02\x02C\u0169\x03" + - "\x02\x02\x02E\u017C\x03\x02\x02\x02G\u018C\x03\x02\x02\x02I\u0197\x03" + - "\x02\x02\x02K\u019F\x03\x02\x02\x02M\u01A6\x03\x02\x02\x02O\u01A8\x03" + - "\x02\x02\x02Q\u01AA\x03\x02\x02\x02S\u01AC\x03\x02\x02\x02U\u01AE\x03" + - "\x02\x02\x02W\u01B0\x03\x02\x02\x02Y\u01B2\x03\x02\x02\x02[\u01B5\x03" + - "\x02\x02\x02]\u01B8\x03\x02\x02\x02_\u01BA\x03\x02\x02\x02a\u01BC\x03" + - "\x02\x02\x02c\u01BF\x03\x02\x02\x02e\u01C2\x03\x02\x02\x02g\u01CB\x03" + - "\x02\x02\x02i\u01CF\x03\x02\x02\x02k\u01D4\x03\x02\x02\x02m\u01DB\x03" + - "\x02\x02\x02o\u01E2\x03\x02\x02\x02q\u01E6\x03\x02\x02\x02s\u01EF\x03" + - "\x02\x02\x02u\u0208\x03\x02\x02\x02w\u0243\x03\x02\x02\x02y\u0246\x03" + - "\x02\x02\x02{\u0262\x03\x02\x02\x02}\u0264\x03\x02\x02\x02\x7F\u027F\x03" + - "\x02\x02\x02\x81\u0281\x03\x02\x02\x02\x83\u028A\x03\x02\x02\x02\x85\u029F" + - "\x03\x02\x02\x02\x87\u02FF\x03\x02\x02\x02\x89\u0301\x03\x02\x02\x02\x8B" + - "\u0309\x03\x02\x02\x02\x8D\u030F\x03\x02\x02\x02\x8F\u031D\x03\x02\x02" + - "\x02\x91\x92\x07r\x02\x02\x92\x93\x07t\x02\x02\x93\x94\x07c\x02\x02\x94" + - "\x95\x07i\x02\x02\x95\x96\x07o\x02\x02\x96\x97\x07c\x02\x02\x97\x04\x03" + - "\x02\x02\x02\x98\x99\x07=\x02\x02\x99\x06\x03\x02\x02\x02\x9A\x9B\x07" + - "e\x02\x02\x9B\x9C\x07c\x02\x02\x9C\x9D\x07u\x02\x02\x9D\x9E\x07j\x02\x02" + - "\x9E\x9F\x07u\x02\x02\x9F\xA0\x07e\x02\x02\xA0\xA1\x07t\x02\x02\xA1\xA2" + - "\x07k\x02\x02\xA2\xA3\x07r\x02\x02\xA3\xA4\x07v\x02\x02\xA4\b\x03\x02" + - "\x02\x02\xA5\xA6\x07`\x02\x02\xA6\n\x03\x02\x02\x02\xA7\xA8\x07\x80\x02" + - "\x02\xA8\f\x03\x02\x02\x02\xA9\xAA\x07@\x02\x02\xAA\xAB\x07?\x02\x02\xAB" + - "\x0E\x03\x02\x02\x02\xAC\xAD\x07@\x02\x02\xAD\x10\x03\x02\x02\x02\xAE" + - "\xAF\x07>\x02\x02\xAF\x12\x03\x02\x02\x02\xB0\xB1\x07>\x02\x02\xB1\xB2" + - "\x07?\x02\x02\xB2\x14\x03\x02\x02\x02\xB3\xB4\x07?\x02\x02\xB4\x16\x03" + - "\x02\x02\x02\xB5\xB6\x07e\x02\x02\xB6\xB7\x07q\x02\x02\xB7\xB8\x07p\x02" + - "\x02\xB8\xB9\x07v\x02\x02\xB9\xBA\x07t\x02\x02\xBA\xBB\x07c\x02\x02\xBB" + - "\xBC\x07e\x02\x02\xBC\xBD\x07v\x02\x02\xBD\x18\x03\x02\x02\x02\xBE\xBF" + - "\x07}\x02\x02\xBF\x1A\x03\x02\x02\x02\xC0\xC1\x07\x7F\x02\x02\xC1\x1C" + - "\x03\x02\x02\x02\xC2\xC3\x07h\x02\x02\xC3\xC4\x07w\x02\x02\xC4\xC5\x07" + - "p\x02\x02\xC5\xC6\x07e\x02\x02\xC6\xC7\x07v\x02\x02\xC7\xC8\x07k\x02\x02" + - "\xC8\xC9\x07q\x02\x02\xC9\xCA\x07p\x02\x02\xCA\x1E\x03\x02\x02\x02\xCB" + - "\xCC\x07*\x02\x02\xCC \x03\x02\x02\x02\xCD\xCE\x07.\x02\x02\xCE\"\x03" + - "\x02\x02\x02\xCF\xD0\x07+\x02\x02\xD0$\x03\x02\x02\x02\xD1\xD2\x07t\x02" + - "\x02\xD2\xD3\x07g\x02\x02\xD3\xD4\x07s\x02\x02\xD4\xD5\x07w\x02\x02\xD5" + - "\xD6\x07k\x02\x02\xD6\xD7\x07t\x02\x02\xD7\xD8\x07g\x02\x02\xD8&\x03\x02" + - "\x02\x02\xD9\xDA\x07k\x02\x02\xDA\xDB\x07h\x02\x02\xDB(\x03\x02\x02\x02" + - "\xDC\xDD\x07g\x02\x02\xDD\xDE\x07n\x02\x02\xDE\xDF\x07u\x02\x02\xDF\xE0" + - "\x07g\x02\x02\xE0*\x03\x02\x02\x02\xE1\xE2\x07p\x02\x02\xE2\xE3\x07g\x02" + - "\x02\xE3\xE4\x07y\x02\x02\xE4,\x03\x02\x02\x02\xE5\xE6\x07]\x02\x02\xE6" + - ".\x03\x02\x02\x02\xE7\xE8\x07_\x02\x02\xE80\x03\x02\x02\x02\xE9\xEA\x07" + - "v\x02\x02\xEA\xEB\x07z\x02\x02\xEB\xEC\x070\x02\x02\xEC\xED\x07q\x02\x02" + - "\xED\xEE\x07w\x02\x02\xEE\xEF\x07v\x02\x02\xEF\xF0\x07r\x02\x02\xF0\xF1" + - "\x07w\x02\x02\xF1\xF2\x07v\x02\x02\xF2\xF3\x07u\x02\x02\xF32\x03\x02\x02" + - "\x02\xF4\xF5\x070\x02\x02\xF5\xF6\x07x\x02\x02\xF6\xF7\x07c\x02\x02\xF7" + - "\xF8\x07n\x02\x02\xF8\xF9\x07w\x02\x02\xF9\xFA\x07g\x02\x02\xFA4\x03\x02" + - "\x02\x02\xFB\xFC\x070\x02\x02\xFC\xFD\x07n\x02\x02\xFD\xFE\x07q\x02\x02" + - "\xFE\xFF\x07e\x02\x02\xFF\u0100\x07m\x02\x02\u0100\u0101\x07k\x02\x02" + - "\u0101\u0102\x07p\x02\x02\u0102\u0103\x07i\x02\x02\u0103\u0104\x07D\x02" + - "\x02\u0104\u0105\x07{\x02\x02\u0105\u0106\x07v\x02\x02\u0106\u0107\x07" + - "g\x02\x02\u0107\u0108\x07e\x02\x02\u0108\u0109\x07q\x02\x02\u0109\u010A" + - "\x07f\x02\x02\u010A\u010B\x07g\x02\x02\u010B6\x03\x02\x02\x02\u010C\u010D" + - "\x070\x02\x02\u010D\u010E\x07v\x02\x02\u010E\u010F\x07q\x02\x02\u010F" + - "\u0110\x07m\x02\x02\u0110\u0111\x07g\x02\x02\u0111\u0112\x07p\x02\x02" + - "\u0112\u0113\x07E\x02\x02\u0113\u0114\x07c\x02\x02\u0114\u0115\x07v\x02" + - "\x02\u0115\u0116\x07g\x02\x02\u0116\u0117\x07i\x02\x02\u0117\u0118\x07" + - "q\x02\x02\u0118\u0119\x07t\x02\x02\u0119\u011A\x07{\x02\x02\u011A8\x03" + - "\x02\x02\x02\u011B\u011C\x070\x02\x02\u011C\u011D\x07p\x02\x02\u011D\u011E" + - "\x07h\x02\x02\u011E\u011F\x07v\x02\x02\u011F\u0120\x07E\x02\x02\u0120" + - "\u0121\x07q\x02\x02\u0121\u0122\x07o\x02\x02\u0122\u0123\x07o\x02\x02" + - "\u0123\u0124\x07k\x02\x02\u0124\u0125\x07v\x02\x02\u0125\u0126\x07o\x02" + - "\x02\u0126\u0127\x07g\x02\x02\u0127\u0128\x07p\x02\x02\u0128\u0129\x07" + - "v\x02\x02\u0129:\x03\x02\x02\x02\u012A\u012B\x070\x02\x02\u012B\u012C" + - "\x07v\x02\x02\u012C\u012D\x07q\x02\x02\u012D\u012E\x07m\x02\x02\u012E" + - "\u012F\x07g\x02\x02\u012F\u0130\x07p\x02\x02\u0130\u0131\x07C\x02\x02" + - "\u0131\u0132\x07o\x02\x02\u0132\u0133\x07q\x02\x02\u0133\u0134\x07w\x02" + - "\x02\u0134\u0135\x07p\x02\x02\u0135\u0136\x07v\x02\x02\u0136<\x03\x02" + - "\x02\x02\u0137\u0138\x07v\x02\x02\u0138\u0139\x07z\x02\x02\u0139\u013A" + - "\x070\x02\x02\u013A\u013B\x07k\x02\x02\u013B\u013C\x07p\x02\x02\u013C" + - "\u013D\x07r\x02\x02\u013D\u013E\x07w\x02\x02\u013E\u013F\x07v\x02\x02" + - "\u013F\u0140\x07u\x02\x02\u0140>\x03\x02\x02\x02\u0141\u0142\x070\x02" + - "\x02\u0142\u0143\x07q\x02\x02\u0143\u0144\x07w\x02\x02\u0144\u0145\x07" + - "v\x02\x02\u0145\u0146\x07r\x02\x02\u0146\u0147\x07q\x02\x02\u0147\u0148" + - "\x07k\x02\x02\u0148\u0149\x07p\x02\x02\u0149\u014A\x07v\x02\x02\u014A" + - "\u014B\x07V\x02\x02\u014B\u014C\x07t\x02\x02\u014C\u014D\x07c\x02\x02" + - "\u014D\u014E\x07p\x02\x02\u014E\u014F\x07u\x02\x02\u014F\u0150\x07c\x02" + - "\x02\u0150\u0151\x07e\x02\x02\u0151\u0152\x07v\x02\x02\u0152\u0153\x07" + - "k\x02\x02\u0153\u0154\x07q\x02\x02\u0154\u0155\x07p\x02\x02\u0155\u0156" + - "\x07J\x02\x02\u0156\u0157\x07c\x02\x02\u0157\u0158\x07u\x02\x02\u0158" + - "\u0159\x07j\x02\x02\u0159@\x03\x02\x02\x02\u015A\u015B\x070\x02\x02\u015B" + - "\u015C\x07q\x02\x02\u015C\u015D\x07w\x02\x02\u015D\u015E\x07v\x02\x02" + - "\u015E\u015F\x07r\x02\x02\u015F\u0160\x07q\x02\x02\u0160\u0161\x07k\x02" + - "\x02\u0161\u0162\x07p\x02\x02\u0162\u0163\x07v\x02\x02\u0163\u0164\x07" + - "K\x02\x02\u0164\u0165\x07p\x02\x02\u0165\u0166\x07f\x02\x02\u0166\u0167" + - "\x07g\x02\x02\u0167\u0168\x07z\x02\x02\u0168B\x03\x02\x02\x02\u0169\u016A" + - "\x070\x02\x02\u016A\u016B\x07w\x02\x02\u016B\u016C\x07p\x02\x02\u016C" + - "\u016D\x07n\x02\x02\u016D\u016E\x07q\x02\x02\u016E\u016F\x07e\x02\x02" + - "\u016F\u0170\x07m\x02\x02\u0170\u0171\x07k\x02\x02\u0171\u0172\x07p\x02" + - "\x02\u0172\u0173\x07i\x02\x02\u0173\u0174\x07D\x02\x02\u0174\u0175\x07" + - "{\x02\x02\u0175\u0176\x07v\x02\x02\u0176\u0177\x07g\x02\x02\u0177\u0178" + - "\x07e\x02\x02\u0178\u0179\x07q\x02\x02\u0179\u017A\x07f\x02\x02\u017A" + - "\u017B\x07g\x02\x02\u017BD\x03\x02\x02\x02\u017C\u017D\x070\x02\x02\u017D" + - "\u017E\x07u\x02\x02\u017E\u017F\x07g\x02\x02\u017F\u0180\x07s\x02\x02" + - "\u0180\u0181\x07w\x02\x02\u0181\u0182\x07g\x02\x02\u0182\u0183\x07p\x02" + - "\x02\u0183\u0184\x07e\x02\x02\u0184\u0185\x07g\x02\x02\u0185\u0186\x07" + - "P\x02\x02\u0186\u0187\x07w\x02\x02\u0187\u0188\x07o\x02\x02\u0188\u0189" + - "\x07d\x02\x02\u0189\u018A\x07g\x02\x02\u018A\u018B\x07t\x02\x02\u018B" + - "F\x03\x02\x02\x02\u018C\u018D\x070\x02\x02\u018D\u018E\x07t\x02\x02\u018E" + - "\u018F\x07g\x02\x02\u018F\u0190\x07x\x02\x02\u0190\u0191\x07g\x02\x02" + - "\u0191\u0192\x07t\x02\x02\u0192\u0193\x07u\x02\x02\u0193\u0194\x07g\x02" + - "\x02\u0194\u0195\x07*\x02\x02\u0195\u0196\x07+\x02\x02\u0196H\x03\x02" + - "\x02\x02\u0197\u0198\x070\x02\x02\u0198\u0199\x07n\x02\x02\u0199\u019A" + - "\x07g\x02\x02\u019A\u019B\x07p\x02\x02\u019B\u019C\x07i\x02\x02\u019C" + - "\u019D\x07v\x02\x02\u019D\u019E\x07j\x02\x02\u019EJ\x03\x02\x02\x02\u019F" + - "\u01A0\x070\x02\x02\u01A0\u01A1\x07u\x02\x02\u01A1\u01A2\x07r\x02\x02" + - "\u01A2\u01A3\x07n\x02\x02\u01A3\u01A4\x07k\x02\x02\u01A4\u01A5\x07v\x02" + - "\x02\u01A5L\x03\x02\x02\x02\u01A6\u01A7\x07#\x02\x02\u01A7N\x03\x02\x02" + - "\x02\u01A8\u01A9\x07/\x02\x02\u01A9P\x03\x02\x02\x02\u01AA\u01AB\x07," + - "\x02\x02\u01ABR\x03\x02\x02\x02\u01AC\u01AD\x071\x02\x02\u01ADT\x03\x02" + - "\x02\x02\u01AE\u01AF\x07\'\x02\x02\u01AFV\x03\x02\x02\x02\u01B0\u01B1" + - "\x07-\x02\x02\u01B1X\x03\x02\x02\x02\u01B2\u01B3\x07?\x02\x02\u01B3\u01B4" + - "\x07?\x02\x02\u01B4Z\x03\x02\x02\x02\u01B5\u01B6\x07#\x02\x02\u01B6\u01B7" + - "\x07?\x02\x02\u01B7\\\x03\x02\x02\x02\u01B8\u01B9\x07(\x02\x02\u01B9^" + - "\x03\x02\x02\x02\u01BA\u01BB\x07~\x02\x02\u01BB`\x03\x02\x02\x02\u01BC" + - "\u01BD\x07(\x02\x02\u01BD\u01BE\x07(\x02\x02\u01BEb\x03\x02\x02\x02\u01BF" + - "\u01C0\x07~\x02\x02\u01C0\u01C1\x07~\x02\x02\u01C1d\x03\x02\x02\x02\u01C2" + - "\u01C3\x07e\x02\x02\u01C3\u01C4\x07q\x02\x02\u01C4\u01C5\x07p\x02\x02" + - "\u01C5\u01C6\x07u\x02\x02\u01C6\u01C7\x07v\x02\x02\u01C7\u01C8\x07c\x02" + - "\x02\u01C8\u01C9\x07p\x02\x02\u01C9\u01CA\x07v\x02\x02\u01CAf\x03\x02" + - "\x02\x02\u01CB\u01CC\x07k\x02\x02\u01CC\u01CD\x07p\x02\x02\u01CD\u01CE" + - "\x07v\x02\x02\u01CEh\x03\x02\x02\x02\u01CF\u01D0\x07d\x02\x02\u01D0\u01D1" + - "\x07q\x02\x02\u01D1\u01D2\x07q\x02\x02\u01D2\u01D3\x07n\x02\x02\u01D3" + - "j\x03\x02\x02\x02\u01D4\u01D5\x07u\x02\x02\u01D5\u01D6\x07v\x02\x02\u01D6" + - "\u01D7\x07t\x02\x02\u01D7\u01D8\x07k\x02\x02\u01D8\u01D9\x07p\x02\x02" + - "\u01D9\u01DA\x07i\x02\x02\u01DAl\x03\x02\x02\x02\u01DB\u01DC\x07r\x02" + - "\x02\u01DC\u01DD\x07w\x02\x02\u01DD\u01DE\x07d\x02\x02\u01DE\u01DF\x07" + - "m\x02\x02\u01DF\u01E0\x07g\x02\x02\u01E0\u01E1\x07{\x02\x02\u01E1n\x03" + - "\x02\x02\x02\u01E2\u01E3\x07u\x02\x02\u01E3\u01E4\x07k\x02\x02\u01E4\u01E5" + - "\x07i\x02\x02\u01E5p\x03\x02\x02\x02\u01E6\u01E7\x07f\x02\x02\u01E7\u01E8" + - "\x07c\x02\x02\u01E8\u01E9\x07v\x02\x02\u01E9\u01EA\x07c\x02\x02\u01EA" + - "\u01EB\x07u\x02\x02\u01EB\u01EC\x07k\x02\x02\u01EC\u01ED\x07i\x02\x02" + - "\u01EDr\x03\x02\x02\x02\u01EE\u01F0\t\x02\x02\x02\u01EF\u01EE\x03\x02" + - "\x02\x02\u01F0\u01F1\x03\x02\x02\x02\u01F1\u01EF\x03\x02\x02\x02\u01F1" + - "\u01F2\x03\x02\x02\x02\u01F2\u01F3\x03\x02\x02\x02\u01F3\u01F5\x070\x02" + - "\x02\u01F4\u01F6\t\x02\x02\x02\u01F5\u01F4\x03\x02\x02\x02\u01F6\u01F7" + - "\x03\x02\x02\x02\u01F7\u01F5\x03\x02\x02\x02\u01F7\u01F8\x03\x02\x02\x02" + - "\u01F8\u01F9\x03\x02\x02\x02\u01F9\u01FB\x070\x02\x02\u01FA\u01FC\t\x02" + - "\x02\x02\u01FB\u01FA"; - private static readonly _serializedATNSegment1: string = - "\x03\x02\x02\x02\u01FC\u01FD\x03\x02\x02\x02\u01FD\u01FB\x03\x02\x02\x02" + - "\u01FD\u01FE\x03\x02\x02\x02\u01FEt\x03\x02\x02\x02\u01FF\u0200\x07v\x02" + - "\x02\u0200\u0201\x07t\x02\x02\u0201\u0202\x07w\x02\x02\u0202\u0209\x07" + - "g\x02\x02\u0203\u0204\x07h\x02\x02\u0204\u0205\x07c\x02\x02\u0205\u0206" + - "\x07n\x02\x02\u0206\u0207\x07u\x02\x02\u0207\u0209\x07g\x02\x02\u0208" + - "\u01FF\x03\x02\x02\x02\u0208\u0203\x03\x02\x02\x02\u0209v\x03\x02\x02" + - "\x02\u020A\u020B\x07u\x02\x02\u020B\u020C\x07c\x02\x02\u020C\u020D\x07" + - "v\x02\x02\u020D\u020E\x07q\x02\x02\u020E\u020F\x07u\x02\x02\u020F\u0210" + - "\x07j\x02\x02\u0210\u0211\x07k\x02\x02\u0211\u0244\x07u\x02\x02\u0212" + - "\u0213\x07u\x02\x02\u0213\u0214\x07c\x02\x02\u0214\u0215\x07v\x02\x02" + - "\u0215\u0244\x07u\x02\x02\u0216\u0217\x07h\x02\x02\u0217\u0218\x07k\x02" + - "\x02\u0218\u0219\x07p\x02\x02\u0219\u021A\x07p\x02\x02\u021A\u021B\x07" + - "g\x02\x02\u021B\u0244\x07{\x02\x02\u021C\u021D\x07d\x02\x02\u021D\u021E" + - "\x07k\x02\x02\u021E\u021F\x07v\x02\x02\u021F\u0244\x07u\x02\x02\u0220" + - "\u0221\x07d\x02\x02\u0221\u0222\x07k\x02\x02\u0222\u0223\x07v\x02\x02" + - "\u0223\u0224\x07e\x02\x02\u0224\u0225\x07q\x02\x02\u0225\u0226\x07k\x02" + - "\x02\u0226\u0244\x07p\x02\x02\u0227\u0228\x07u\x02\x02\u0228\u0229\x07" + - "g\x02\x02\u0229\u022A\x07e\x02\x02\u022A\u022B\x07q\x02\x02\u022B\u022C" + - "\x07p\x02\x02\u022C\u022D\x07f\x02\x02\u022D\u0244\x07u\x02\x02\u022E" + - "\u022F\x07o\x02\x02\u022F\u0230\x07k\x02\x02\u0230\u0231\x07p\x02\x02" + - "\u0231\u0232\x07w\x02\x02\u0232\u0233\x07v\x02\x02\u0233\u0234\x07g\x02" + - "\x02\u0234\u0244\x07u\x02\x02\u0235\u0236\x07j\x02\x02\u0236\u0237\x07" + - "q\x02\x02\u0237\u0238\x07w\x02\x02\u0238\u0239\x07t\x02\x02\u0239\u0244" + - "\x07u\x02\x02\u023A\u023B\x07f\x02\x02\u023B\u023C\x07c\x02\x02\u023C" + - "\u023D\x07{\x02\x02\u023D\u0244\x07u\x02\x02\u023E\u023F\x07y\x02\x02" + - "\u023F\u0240\x07g\x02\x02\u0240\u0241\x07g\x02\x02\u0241\u0242\x07m\x02" + - "\x02\u0242\u0244\x07u\x02\x02\u0243\u020A\x03\x02\x02\x02\u0243\u0212" + - "\x03\x02\x02\x02\u0243\u0216\x03\x02\x02\x02\u0243\u021C\x03\x02\x02\x02" + - "\u0243\u0220\x03\x02\x02\x02\u0243\u0227\x03\x02\x02\x02\u0243\u022E\x03" + - "\x02\x02\x02\u0243\u0235\x03\x02\x02\x02\u0243\u023A\x03\x02\x02\x02\u0243" + - "\u023E\x03\x02\x02\x02\u0244x\x03\x02\x02\x02\u0245\u0247\t\x03\x02\x02" + - "\u0246\u0245\x03\x02\x02\x02\u0246\u0247\x03\x02\x02\x02\u0247\u0249\x03" + - "\x02\x02\x02\u0248\u024A\t\x02\x02\x02\u0249\u0248\x03\x02\x02\x02\u024A" + - "\u024B\x03\x02\x02\x02\u024B\u0249\x03\x02\x02\x02\u024B\u024C\x03\x02" + - "\x02\x02\u024C\u0253\x03\x02\x02\x02\u024D\u024F\t\x04\x02\x02\u024E\u0250" + - "\t\x02\x02\x02\u024F\u024E\x03\x02\x02\x02\u0250\u0251\x03\x02\x02\x02" + - "\u0251\u024F\x03\x02\x02\x02\u0251\u0252\x03\x02\x02\x02\u0252\u0254\x03" + - "\x02\x02\x02\u0253\u024D\x03\x02\x02\x02\u0253\u0254\x03\x02\x02\x02\u0254" + - "z\x03\x02\x02\x02\u0255\u0256\x07d\x02\x02\u0256\u0257\x07{\x02\x02\u0257" + - "\u0258\x07v\x02\x02\u0258\u0259\x07g\x02\x02\u0259\u025A\x07u\x02\x02" + - "\u025A\u025C\x03\x02\x02\x02\u025B\u025D\x05}?\x02\u025C\u025B\x03\x02" + - "\x02\x02\u025C\u025D\x03\x02\x02\x02\u025D\u0263\x03\x02\x02\x02\u025E" + - "\u025F\x07d\x02\x02\u025F\u0260\x07{\x02\x02\u0260\u0261\x07v\x02\x02" + - "\u0261\u0263\x07g\x02\x02\u0262\u0255\x03\x02\x02\x02\u0262\u025E\x03" + - "\x02\x02\x02\u0263|\x03\x02\x02\x02\u0264\u0268\t\x05\x02\x02\u0265\u0267" + - "\t\x02\x02\x02\u0266\u0265\x03\x02\x02\x02\u0267\u026A\x03\x02\x02\x02" + - "\u0268\u0266\x03\x02\x02\x02\u0268\u0269\x03\x02\x02\x02\u0269~\x03\x02" + - "\x02\x02\u026A\u0268\x03\x02\x02\x02\u026B\u0271\x07$\x02\x02\u026C\u026D" + - "\x07^\x02\x02\u026D\u0270\x07$\x02\x02\u026E\u0270\n\x06\x02\x02\u026F" + - "\u026C\x03\x02\x02\x02\u026F\u026E\x03\x02\x02\x02\u0270\u0273\x03\x02" + - "\x02\x02\u0271\u0272\x03\x02\x02\x02\u0271\u026F\x03\x02\x02\x02\u0272" + - "\u0274\x03\x02\x02\x02\u0273\u0271\x03\x02\x02\x02\u0274\u0280\x07$\x02" + - "\x02\u0275\u027B\x07)\x02\x02\u0276\u0277\x07^\x02\x02\u0277\u027A\x07" + - ")\x02\x02\u0278\u027A\n\x07\x02\x02\u0279\u0276\x03\x02\x02\x02\u0279" + - "\u0278\x03\x02\x02\x02\u027A\u027D\x03\x02\x02\x02\u027B\u027C\x03\x02" + - "\x02\x02\u027B\u0279\x03\x02\x02\x02\u027C\u027E\x03\x02\x02\x02\u027D" + - "\u027B\x03\x02\x02\x02\u027E\u0280\x07)\x02\x02\u027F\u026B\x03\x02\x02" + - "\x02\u027F\u0275\x03\x02\x02\x02\u0280\x80\x03\x02\x02\x02\u0281\u0282" + - "\x07f\x02\x02\u0282\u0283\x07c\x02\x02\u0283\u0284\x07v\x02\x02\u0284" + - "\u0285\x07g\x02\x02\u0285\u0286\x07*\x02\x02\u0286\u0287\x03\x02\x02\x02" + - "\u0287\u0288\x05\x7F@\x02\u0288\u0289\x07+\x02\x02\u0289\x82\x03\x02\x02" + - "\x02\u028A\u028B\x072\x02\x02\u028B\u028F\t\b\x02\x02\u028C\u028E\t\t" + - "\x02\x02\u028D\u028C\x03\x02\x02\x02\u028E\u0291\x03\x02\x02\x02\u028F" + - "\u028D\x03\x02\x02\x02\u028F\u0290\x03\x02\x02\x02\u0290\x84\x03\x02\x02" + - "\x02\u0291\u028F\x03\x02\x02\x02\u0292\u0293\x07v\x02\x02\u0293\u0294" + - "\x07z\x02\x02\u0294\u0295\x070\x02\x02\u0295\u0296\x07c\x02\x02\u0296" + - "\u0297\x07i\x02\x02\u0297\u02A0\x07g\x02\x02\u0298\u0299\x07v\x02\x02" + - "\u0299\u029A\x07z\x02\x02\u029A\u029B\x070\x02\x02\u029B\u029C\x07v\x02" + - "\x02\u029C\u029D\x07k\x02\x02\u029D\u029E\x07o\x02\x02\u029E\u02A0\x07" + - "g\x02\x02\u029F\u0292\x03\x02\x02\x02\u029F\u0298\x03\x02\x02\x02\u02A0" + - "\x86\x03\x02\x02\x02\u02A1\u02A2\x07v\x02\x02\u02A2\u02A3\x07j\x02\x02" + - "\u02A3\u02A4\x07k\x02\x02\u02A4\u02A5\x07u\x02\x02\u02A5\u02A6\x070\x02" + - "\x02\u02A6\u02A7\x07c\x02\x02\u02A7\u02A8\x07e\x02\x02\u02A8\u02A9\x07" + - "v\x02\x02\u02A9\u02AA\x07k\x02\x02\u02AA\u02AB\x07x\x02\x02\u02AB\u02AC" + - "\x07g\x02\x02\u02AC\u02AD\x07K\x02\x02\u02AD\u02AE\x07p\x02\x02\u02AE" + - "\u02AF\x07r\x02\x02\u02AF\u02B0\x07w\x02\x02\u02B0\u02B1\x07v\x02\x02" + - "\u02B1\u02B2\x07K\x02\x02\u02B2\u02B3\x07p\x02\x02\u02B3\u02B4\x07f\x02" + - "\x02\u02B4\u02B5\x07g\x02\x02\u02B5\u0300\x07z\x02\x02\u02B6\u02B7\x07" + - "v\x02\x02\u02B7\u02B8\x07j\x02\x02\u02B8\u02B9\x07k\x02\x02\u02B9\u02BA" + - "\x07u\x02\x02\u02BA\u02BB\x070\x02\x02\u02BB\u02BC\x07c\x02\x02\u02BC" + - "\u02BD\x07e\x02\x02\u02BD\u02BE\x07v\x02\x02\u02BE\u02BF\x07k\x02\x02" + - "\u02BF\u02C0\x07x\x02\x02\u02C0\u02C1\x07g\x02\x02\u02C1\u02C2\x07D\x02" + - "\x02\u02C2\u02C3\x07{\x02\x02\u02C3\u02C4\x07v\x02\x02\u02C4\u02C5\x07" + - "g\x02\x02\u02C5\u02C6\x07e\x02\x02\u02C6\u02C7\x07q\x02\x02\u02C7\u02C8" + - "\x07f\x02\x02\u02C8\u0300\x07g\x02\x02\u02C9\u02CA\x07v\x02\x02\u02CA" + - "\u02CB\x07z\x02\x02\u02CB\u02CC\x070\x02\x02\u02CC\u02CD\x07k\x02\x02" + - "\u02CD\u02CE\x07p\x02\x02\u02CE\u02CF\x07r\x02\x02\u02CF\u02D0\x07w\x02" + - "\x02\u02D0\u02D1\x07v\x02\x02\u02D1\u02D2\x07u\x02\x02\u02D2\u02D3\x07" + - "0\x02\x02\u02D3\u02D4\x07n\x02\x02\u02D4\u02D5\x07g\x02\x02\u02D5\u02D6" + - "\x07p\x02\x02\u02D6\u02D7\x07i\x02\x02\u02D7\u02D8\x07v\x02\x02\u02D8" + - "\u0300\x07j\x02\x02\u02D9\u02DA\x07v\x02\x02\u02DA\u02DB\x07z\x02\x02" + - "\u02DB\u02DC\x070\x02\x02\u02DC\u02DD\x07q\x02\x02\u02DD\u02DE\x07w\x02" + - "\x02\u02DE\u02DF\x07v\x02\x02\u02DF\u02E0\x07r\x02\x02\u02E0\u02E1\x07" + - "w\x02\x02\u02E1\u02E2\x07v\x02\x02\u02E2\u02E3\x07u\x02\x02\u02E3\u02E4" + - "\x070\x02\x02\u02E4\u02E5\x07n\x02\x02\u02E5\u02E6\x07g\x02\x02\u02E6" + - "\u02E7\x07p\x02\x02\u02E7\u02E8\x07i\x02\x02\u02E8\u02E9\x07v\x02\x02" + - "\u02E9\u0300\x07j\x02\x02\u02EA\u02EB\x07v\x02\x02\u02EB\u02EC\x07z\x02" + - "\x02\u02EC\u02ED\x070\x02\x02\u02ED\u02EE\x07x\x02\x02\u02EE\u02EF\x07" + - "g\x02\x02\u02EF\u02F0\x07t\x02\x02\u02F0\u02F1\x07u\x02\x02\u02F1\u02F2" + - "\x07k\x02\x02\u02F2\u02F3\x07q\x02\x02\u02F3\u0300\x07p\x02\x02\u02F4" + - "\u02F5\x07v\x02\x02\u02F5\u02F6\x07z\x02\x02\u02F6\u02F7\x070\x02\x02" + - "\u02F7\u02F8\x07n\x02\x02\u02F8\u02F9\x07q\x02\x02\u02F9\u02FA\x07e\x02" + - "\x02\u02FA\u02FB\x07m\x02\x02\u02FB\u02FC\x07v\x02\x02\u02FC\u02FD\x07" + - "k\x02\x02\u02FD\u02FE\x07o\x02\x02\u02FE\u0300\x07g\x02\x02\u02FF\u02A1" + - "\x03\x02\x02\x02\u02FF\u02B6\x03\x02\x02\x02\u02FF\u02C9\x03\x02\x02\x02" + - "\u02FF\u02D9\x03\x02\x02\x02\u02FF\u02EA\x03\x02\x02\x02\u02FF\u02F4\x03" + - "\x02\x02\x02\u0300\x88\x03\x02\x02\x02\u0301\u0305\t\n\x02\x02\u0302\u0304" + - "\t\v\x02\x02\u0303\u0302\x03\x02\x02\x02\u0304\u0307\x03\x02\x02\x02\u0305" + - "\u0303\x03\x02\x02\x02\u0305\u0306\x03\x02\x02\x02\u0306\x8A\x03\x02\x02" + - "\x02\u0307\u0305\x03\x02\x02\x02\u0308\u030A\t\f\x02\x02\u0309\u0308\x03" + - "\x02\x02\x02\u030A\u030B\x03\x02\x02\x02\u030B\u0309\x03\x02\x02\x02\u030B" + - "\u030C\x03\x02\x02\x02\u030C\u030D\x03\x02\x02\x02\u030D\u030E\bF\x02" + - "\x02\u030E\x8C\x03\x02\x02\x02\u030F\u0310\x071\x02\x02\u0310\u0311\x07" + - ",\x02\x02\u0311\u0315\x03\x02\x02\x02\u0312\u0314\v\x02\x02\x02\u0313" + - "\u0312\x03\x02\x02\x02\u0314\u0317\x03\x02\x02\x02\u0315\u0316\x03\x02" + - "\x02\x02\u0315\u0313\x03\x02\x02\x02\u0316\u0318\x03\x02\x02\x02\u0317" + - "\u0315\x03\x02\x02\x02\u0318\u0319\x07,\x02\x02\u0319\u031A\x071\x02\x02" + - "\u031A\u031B\x03\x02\x02\x02\u031B\u031C\bG\x03\x02\u031C\x8E\x03\x02" + - "\x02\x02\u031D\u031E\x071\x02\x02\u031E\u031F\x071\x02\x02\u031F\u0323" + - "\x03\x02\x02\x02\u0320\u0322\n\r\x02\x02\u0321\u0320\x03\x02\x02\x02\u0322" + - "\u0325\x03\x02\x02\x02\u0323\u0321\x03\x02\x02\x02\u0323\u0324\x03\x02" + - "\x02\x02\u0324\u0326\x03\x02\x02\x02\u0325\u0323\x03\x02\x02\x02\u0326" + - "\u0327\bH\x03\x02\u0327\x90\x03\x02\x02\x02\x1B\x02\u01F1\u01F7\u01FD" + - "\u0208\u0243\u0246\u024B\u0251\u0253\u025C\u0262\u0268\u026F\u0271\u0279" + - "\u027B\u027F\u028F\u029F\u02FF\u0305\u030B\u0315\u0323\x04\b\x02\x02\x02" + - "\x03\x02"; - public static readonly _serializedATN: string = Utils.join( - [ - CashScriptLexer._serializedATNSegment0, - CashScriptLexer._serializedATNSegment1, - ], - "", - ); - public static __ATN: ATN; + public static readonly _serializedATN: number[] = [4,0,71,806,6,-1,2,0, + 7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9, + 7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7, + 16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23, + 2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2, + 31,7,31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38, + 7,38,2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7, + 45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52, + 2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,59,7,59,2, + 60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,65,2,66,7,66,2,67, + 7,67,2,68,7,68,2,69,7,69,2,70,7,70,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1, + 1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,4,1,4,1,5,1,5,1,5, + 1,6,1,6,1,7,1,7,1,8,1,8,1,8,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,11,1,11,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, + 13,1,14,1,14,1,15,1,15,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17, + 1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1, + 22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24, + 1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1, + 25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26, + 1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1, + 27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28, + 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1, + 29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30, + 1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1, + 31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33, + 1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1, + 34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36, + 1,36,1,36,1,37,1,37,1,38,1,38,1,39,1,39,1,40,1,40,1,41,1,41,1,42,1,42,1, + 43,1,43,1,43,1,44,1,44,1,44,1,45,1,45,1,46,1,46,1,47,1,47,1,47,1,48,1,48, + 1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1, + 51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53, + 1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1, + 55,1,55,1,56,4,56,494,8,56,11,56,12,56,495,1,56,1,56,4,56,500,8,56,11,56, + 12,56,501,1,56,1,56,4,56,506,8,56,11,56,12,56,507,1,57,1,57,1,57,1,57,1, + 57,1,57,1,57,1,57,1,57,3,57,519,8,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58, + 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, + 58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, + 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, + 58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,578,8,58,1,59,3,59,581,8,59,1,59, + 4,59,584,8,59,11,59,12,59,585,1,59,1,59,4,59,590,8,59,11,59,12,59,591,3, + 59,594,8,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,603,8,60,1,60,1,60, + 1,60,1,60,3,60,609,8,60,1,61,1,61,5,61,613,8,61,10,61,12,61,616,9,61,1, + 62,1,62,1,62,1,62,5,62,622,8,62,10,62,12,62,625,9,62,1,62,1,62,1,62,1,62, + 1,62,5,62,632,8,62,10,62,12,62,635,9,62,1,62,3,62,638,8,62,1,63,1,63,1, + 63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,5,64,652,8,64,10,64,12, + 64,655,9,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,3,65,670,8,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,766,8,66,1, + 67,1,67,5,67,770,8,67,10,67,12,67,773,9,67,1,68,4,68,776,8,68,11,68,12, + 68,777,1,68,1,68,1,69,1,69,1,69,1,69,5,69,786,8,69,10,69,12,69,789,9,69, + 1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,5,70,800,8,70,10,70,12,70, + 803,9,70,1,70,1,70,3,623,633,787,0,71,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15, + 8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20, + 41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, + 65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44, + 89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, + 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131, + 66,133,67,135,68,137,69,139,70,141,71,1,0,12,1,0,48,57,1,0,45,45,2,0,69, + 69,101,101,1,0,49,57,3,0,10,10,13,13,34,34,3,0,10,10,13,13,39,39,2,0,88, + 88,120,120,3,0,48,57,65,70,97,102,2,0,65,90,97,122,4,0,48,57,65,90,95,95, + 97,122,3,0,9,10,12,13,32,32,2,0,10,10,13,13,841,0,1,1,0,0,0,0,3,1,0,0,0, + 0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0, + 0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0, + 27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0, + 0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0, + 49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0, + 0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0, + 71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81,1,0, + 0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0, + 93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1, + 0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0, + 0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0, + 0,0,125,1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0, + 0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,1,143,1,0,0,0,3, + 150,1,0,0,0,5,152,1,0,0,0,7,163,1,0,0,0,9,165,1,0,0,0,11,167,1,0,0,0,13, + 170,1,0,0,0,15,172,1,0,0,0,17,174,1,0,0,0,19,177,1,0,0,0,21,179,1,0,0,0, + 23,188,1,0,0,0,25,190,1,0,0,0,27,192,1,0,0,0,29,201,1,0,0,0,31,203,1,0, + 0,0,33,205,1,0,0,0,35,207,1,0,0,0,37,215,1,0,0,0,39,218,1,0,0,0,41,223, + 1,0,0,0,43,227,1,0,0,0,45,229,1,0,0,0,47,231,1,0,0,0,49,242,1,0,0,0,51, + 249,1,0,0,0,53,266,1,0,0,0,55,281,1,0,0,0,57,296,1,0,0,0,59,309,1,0,0,0, + 61,319,1,0,0,0,63,344,1,0,0,0,65,359,1,0,0,0,67,378,1,0,0,0,69,394,1,0, + 0,0,71,405,1,0,0,0,73,413,1,0,0,0,75,420,1,0,0,0,77,422,1,0,0,0,79,424, + 1,0,0,0,81,426,1,0,0,0,83,428,1,0,0,0,85,430,1,0,0,0,87,432,1,0,0,0,89, + 435,1,0,0,0,91,438,1,0,0,0,93,440,1,0,0,0,95,442,1,0,0,0,97,445,1,0,0,0, + 99,448,1,0,0,0,101,457,1,0,0,0,103,461,1,0,0,0,105,466,1,0,0,0,107,473, + 1,0,0,0,109,480,1,0,0,0,111,484,1,0,0,0,113,493,1,0,0,0,115,518,1,0,0,0, + 117,577,1,0,0,0,119,580,1,0,0,0,121,608,1,0,0,0,123,610,1,0,0,0,125,637, + 1,0,0,0,127,639,1,0,0,0,129,648,1,0,0,0,131,669,1,0,0,0,133,765,1,0,0,0, + 135,767,1,0,0,0,137,775,1,0,0,0,139,781,1,0,0,0,141,795,1,0,0,0,143,144, + 5,112,0,0,144,145,5,114,0,0,145,146,5,97,0,0,146,147,5,103,0,0,147,148, + 5,109,0,0,148,149,5,97,0,0,149,2,1,0,0,0,150,151,5,59,0,0,151,4,1,0,0,0, + 152,153,5,99,0,0,153,154,5,97,0,0,154,155,5,115,0,0,155,156,5,104,0,0,156, + 157,5,115,0,0,157,158,5,99,0,0,158,159,5,114,0,0,159,160,5,105,0,0,160, + 161,5,112,0,0,161,162,5,116,0,0,162,6,1,0,0,0,163,164,5,94,0,0,164,8,1, + 0,0,0,165,166,5,126,0,0,166,10,1,0,0,0,167,168,5,62,0,0,168,169,5,61,0, + 0,169,12,1,0,0,0,170,171,5,62,0,0,171,14,1,0,0,0,172,173,5,60,0,0,173,16, + 1,0,0,0,174,175,5,60,0,0,175,176,5,61,0,0,176,18,1,0,0,0,177,178,5,61,0, + 0,178,20,1,0,0,0,179,180,5,99,0,0,180,181,5,111,0,0,181,182,5,110,0,0,182, + 183,5,116,0,0,183,184,5,114,0,0,184,185,5,97,0,0,185,186,5,99,0,0,186,187, + 5,116,0,0,187,22,1,0,0,0,188,189,5,123,0,0,189,24,1,0,0,0,190,191,5,125, + 0,0,191,26,1,0,0,0,192,193,5,102,0,0,193,194,5,117,0,0,194,195,5,110,0, + 0,195,196,5,99,0,0,196,197,5,116,0,0,197,198,5,105,0,0,198,199,5,111,0, + 0,199,200,5,110,0,0,200,28,1,0,0,0,201,202,5,40,0,0,202,30,1,0,0,0,203, + 204,5,44,0,0,204,32,1,0,0,0,205,206,5,41,0,0,206,34,1,0,0,0,207,208,5,114, + 0,0,208,209,5,101,0,0,209,210,5,113,0,0,210,211,5,117,0,0,211,212,5,105, + 0,0,212,213,5,114,0,0,213,214,5,101,0,0,214,36,1,0,0,0,215,216,5,105,0, + 0,216,217,5,102,0,0,217,38,1,0,0,0,218,219,5,101,0,0,219,220,5,108,0,0, + 220,221,5,115,0,0,221,222,5,101,0,0,222,40,1,0,0,0,223,224,5,110,0,0,224, + 225,5,101,0,0,225,226,5,119,0,0,226,42,1,0,0,0,227,228,5,91,0,0,228,44, + 1,0,0,0,229,230,5,93,0,0,230,46,1,0,0,0,231,232,5,116,0,0,232,233,5,120, + 0,0,233,234,5,46,0,0,234,235,5,111,0,0,235,236,5,117,0,0,236,237,5,116, + 0,0,237,238,5,112,0,0,238,239,5,117,0,0,239,240,5,116,0,0,240,241,5,115, + 0,0,241,48,1,0,0,0,242,243,5,46,0,0,243,244,5,118,0,0,244,245,5,97,0,0, + 245,246,5,108,0,0,246,247,5,117,0,0,247,248,5,101,0,0,248,50,1,0,0,0,249, + 250,5,46,0,0,250,251,5,108,0,0,251,252,5,111,0,0,252,253,5,99,0,0,253,254, + 5,107,0,0,254,255,5,105,0,0,255,256,5,110,0,0,256,257,5,103,0,0,257,258, + 5,66,0,0,258,259,5,121,0,0,259,260,5,116,0,0,260,261,5,101,0,0,261,262, + 5,99,0,0,262,263,5,111,0,0,263,264,5,100,0,0,264,265,5,101,0,0,265,52,1, + 0,0,0,266,267,5,46,0,0,267,268,5,116,0,0,268,269,5,111,0,0,269,270,5,107, + 0,0,270,271,5,101,0,0,271,272,5,110,0,0,272,273,5,67,0,0,273,274,5,97,0, + 0,274,275,5,116,0,0,275,276,5,101,0,0,276,277,5,103,0,0,277,278,5,111,0, + 0,278,279,5,114,0,0,279,280,5,121,0,0,280,54,1,0,0,0,281,282,5,46,0,0,282, + 283,5,110,0,0,283,284,5,102,0,0,284,285,5,116,0,0,285,286,5,67,0,0,286, + 287,5,111,0,0,287,288,5,109,0,0,288,289,5,109,0,0,289,290,5,105,0,0,290, + 291,5,116,0,0,291,292,5,109,0,0,292,293,5,101,0,0,293,294,5,110,0,0,294, + 295,5,116,0,0,295,56,1,0,0,0,296,297,5,46,0,0,297,298,5,116,0,0,298,299, + 5,111,0,0,299,300,5,107,0,0,300,301,5,101,0,0,301,302,5,110,0,0,302,303, + 5,65,0,0,303,304,5,109,0,0,304,305,5,111,0,0,305,306,5,117,0,0,306,307, + 5,110,0,0,307,308,5,116,0,0,308,58,1,0,0,0,309,310,5,116,0,0,310,311,5, + 120,0,0,311,312,5,46,0,0,312,313,5,105,0,0,313,314,5,110,0,0,314,315,5, + 112,0,0,315,316,5,117,0,0,316,317,5,116,0,0,317,318,5,115,0,0,318,60,1, + 0,0,0,319,320,5,46,0,0,320,321,5,111,0,0,321,322,5,117,0,0,322,323,5,116, + 0,0,323,324,5,112,0,0,324,325,5,111,0,0,325,326,5,105,0,0,326,327,5,110, + 0,0,327,328,5,116,0,0,328,329,5,84,0,0,329,330,5,114,0,0,330,331,5,97,0, + 0,331,332,5,110,0,0,332,333,5,115,0,0,333,334,5,97,0,0,334,335,5,99,0,0, + 335,336,5,116,0,0,336,337,5,105,0,0,337,338,5,111,0,0,338,339,5,110,0,0, + 339,340,5,72,0,0,340,341,5,97,0,0,341,342,5,115,0,0,342,343,5,104,0,0,343, + 62,1,0,0,0,344,345,5,46,0,0,345,346,5,111,0,0,346,347,5,117,0,0,347,348, + 5,116,0,0,348,349,5,112,0,0,349,350,5,111,0,0,350,351,5,105,0,0,351,352, + 5,110,0,0,352,353,5,116,0,0,353,354,5,73,0,0,354,355,5,110,0,0,355,356, + 5,100,0,0,356,357,5,101,0,0,357,358,5,120,0,0,358,64,1,0,0,0,359,360,5, + 46,0,0,360,361,5,117,0,0,361,362,5,110,0,0,362,363,5,108,0,0,363,364,5, + 111,0,0,364,365,5,99,0,0,365,366,5,107,0,0,366,367,5,105,0,0,367,368,5, + 110,0,0,368,369,5,103,0,0,369,370,5,66,0,0,370,371,5,121,0,0,371,372,5, + 116,0,0,372,373,5,101,0,0,373,374,5,99,0,0,374,375,5,111,0,0,375,376,5, + 100,0,0,376,377,5,101,0,0,377,66,1,0,0,0,378,379,5,46,0,0,379,380,5,115, + 0,0,380,381,5,101,0,0,381,382,5,113,0,0,382,383,5,117,0,0,383,384,5,101, + 0,0,384,385,5,110,0,0,385,386,5,99,0,0,386,387,5,101,0,0,387,388,5,78,0, + 0,388,389,5,117,0,0,389,390,5,109,0,0,390,391,5,98,0,0,391,392,5,101,0, + 0,392,393,5,114,0,0,393,68,1,0,0,0,394,395,5,46,0,0,395,396,5,114,0,0,396, + 397,5,101,0,0,397,398,5,118,0,0,398,399,5,101,0,0,399,400,5,114,0,0,400, + 401,5,115,0,0,401,402,5,101,0,0,402,403,5,40,0,0,403,404,5,41,0,0,404,70, + 1,0,0,0,405,406,5,46,0,0,406,407,5,108,0,0,407,408,5,101,0,0,408,409,5, + 110,0,0,409,410,5,103,0,0,410,411,5,116,0,0,411,412,5,104,0,0,412,72,1, + 0,0,0,413,414,5,46,0,0,414,415,5,115,0,0,415,416,5,112,0,0,416,417,5,108, + 0,0,417,418,5,105,0,0,418,419,5,116,0,0,419,74,1,0,0,0,420,421,5,33,0,0, + 421,76,1,0,0,0,422,423,5,45,0,0,423,78,1,0,0,0,424,425,5,42,0,0,425,80, + 1,0,0,0,426,427,5,47,0,0,427,82,1,0,0,0,428,429,5,37,0,0,429,84,1,0,0,0, + 430,431,5,43,0,0,431,86,1,0,0,0,432,433,5,61,0,0,433,434,5,61,0,0,434,88, + 1,0,0,0,435,436,5,33,0,0,436,437,5,61,0,0,437,90,1,0,0,0,438,439,5,38,0, + 0,439,92,1,0,0,0,440,441,5,124,0,0,441,94,1,0,0,0,442,443,5,38,0,0,443, + 444,5,38,0,0,444,96,1,0,0,0,445,446,5,124,0,0,446,447,5,124,0,0,447,98, + 1,0,0,0,448,449,5,99,0,0,449,450,5,111,0,0,450,451,5,110,0,0,451,452,5, + 115,0,0,452,453,5,116,0,0,453,454,5,97,0,0,454,455,5,110,0,0,455,456,5, + 116,0,0,456,100,1,0,0,0,457,458,5,105,0,0,458,459,5,110,0,0,459,460,5,116, + 0,0,460,102,1,0,0,0,461,462,5,98,0,0,462,463,5,111,0,0,463,464,5,111,0, + 0,464,465,5,108,0,0,465,104,1,0,0,0,466,467,5,115,0,0,467,468,5,116,0,0, + 468,469,5,114,0,0,469,470,5,105,0,0,470,471,5,110,0,0,471,472,5,103,0,0, + 472,106,1,0,0,0,473,474,5,112,0,0,474,475,5,117,0,0,475,476,5,98,0,0,476, + 477,5,107,0,0,477,478,5,101,0,0,478,479,5,121,0,0,479,108,1,0,0,0,480,481, + 5,115,0,0,481,482,5,105,0,0,482,483,5,103,0,0,483,110,1,0,0,0,484,485,5, + 100,0,0,485,486,5,97,0,0,486,487,5,116,0,0,487,488,5,97,0,0,488,489,5,115, + 0,0,489,490,5,105,0,0,490,491,5,103,0,0,491,112,1,0,0,0,492,494,7,0,0,0, + 493,492,1,0,0,0,494,495,1,0,0,0,495,493,1,0,0,0,495,496,1,0,0,0,496,497, + 1,0,0,0,497,499,5,46,0,0,498,500,7,0,0,0,499,498,1,0,0,0,500,501,1,0,0, + 0,501,499,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503,505,5,46,0,0,504, + 506,7,0,0,0,505,504,1,0,0,0,506,507,1,0,0,0,507,505,1,0,0,0,507,508,1,0, + 0,0,508,114,1,0,0,0,509,510,5,116,0,0,510,511,5,114,0,0,511,512,5,117,0, + 0,512,519,5,101,0,0,513,514,5,102,0,0,514,515,5,97,0,0,515,516,5,108,0, + 0,516,517,5,115,0,0,517,519,5,101,0,0,518,509,1,0,0,0,518,513,1,0,0,0,519, + 116,1,0,0,0,520,521,5,115,0,0,521,522,5,97,0,0,522,523,5,116,0,0,523,524, + 5,111,0,0,524,525,5,115,0,0,525,526,5,104,0,0,526,527,5,105,0,0,527,578, + 5,115,0,0,528,529,5,115,0,0,529,530,5,97,0,0,530,531,5,116,0,0,531,578, + 5,115,0,0,532,533,5,102,0,0,533,534,5,105,0,0,534,535,5,110,0,0,535,536, + 5,110,0,0,536,537,5,101,0,0,537,578,5,121,0,0,538,539,5,98,0,0,539,540, + 5,105,0,0,540,541,5,116,0,0,541,578,5,115,0,0,542,543,5,98,0,0,543,544, + 5,105,0,0,544,545,5,116,0,0,545,546,5,99,0,0,546,547,5,111,0,0,547,548, + 5,105,0,0,548,578,5,110,0,0,549,550,5,115,0,0,550,551,5,101,0,0,551,552, + 5,99,0,0,552,553,5,111,0,0,553,554,5,110,0,0,554,555,5,100,0,0,555,578, + 5,115,0,0,556,557,5,109,0,0,557,558,5,105,0,0,558,559,5,110,0,0,559,560, + 5,117,0,0,560,561,5,116,0,0,561,562,5,101,0,0,562,578,5,115,0,0,563,564, + 5,104,0,0,564,565,5,111,0,0,565,566,5,117,0,0,566,567,5,114,0,0,567,578, + 5,115,0,0,568,569,5,100,0,0,569,570,5,97,0,0,570,571,5,121,0,0,571,578, + 5,115,0,0,572,573,5,119,0,0,573,574,5,101,0,0,574,575,5,101,0,0,575,576, + 5,107,0,0,576,578,5,115,0,0,577,520,1,0,0,0,577,528,1,0,0,0,577,532,1,0, + 0,0,577,538,1,0,0,0,577,542,1,0,0,0,577,549,1,0,0,0,577,556,1,0,0,0,577, + 563,1,0,0,0,577,568,1,0,0,0,577,572,1,0,0,0,578,118,1,0,0,0,579,581,7,1, + 0,0,580,579,1,0,0,0,580,581,1,0,0,0,581,583,1,0,0,0,582,584,7,0,0,0,583, + 582,1,0,0,0,584,585,1,0,0,0,585,583,1,0,0,0,585,586,1,0,0,0,586,593,1,0, + 0,0,587,589,7,2,0,0,588,590,7,0,0,0,589,588,1,0,0,0,590,591,1,0,0,0,591, + 589,1,0,0,0,591,592,1,0,0,0,592,594,1,0,0,0,593,587,1,0,0,0,593,594,1,0, + 0,0,594,120,1,0,0,0,595,596,5,98,0,0,596,597,5,121,0,0,597,598,5,116,0, + 0,598,599,5,101,0,0,599,600,5,115,0,0,600,602,1,0,0,0,601,603,3,123,61, + 0,602,601,1,0,0,0,602,603,1,0,0,0,603,609,1,0,0,0,604,605,5,98,0,0,605, + 606,5,121,0,0,606,607,5,116,0,0,607,609,5,101,0,0,608,595,1,0,0,0,608,604, + 1,0,0,0,609,122,1,0,0,0,610,614,7,3,0,0,611,613,7,0,0,0,612,611,1,0,0,0, + 613,616,1,0,0,0,614,612,1,0,0,0,614,615,1,0,0,0,615,124,1,0,0,0,616,614, + 1,0,0,0,617,623,5,34,0,0,618,619,5,92,0,0,619,622,5,34,0,0,620,622,8,4, + 0,0,621,618,1,0,0,0,621,620,1,0,0,0,622,625,1,0,0,0,623,624,1,0,0,0,623, + 621,1,0,0,0,624,626,1,0,0,0,625,623,1,0,0,0,626,638,5,34,0,0,627,633,5, + 39,0,0,628,629,5,92,0,0,629,632,5,39,0,0,630,632,8,5,0,0,631,628,1,0,0, + 0,631,630,1,0,0,0,632,635,1,0,0,0,633,634,1,0,0,0,633,631,1,0,0,0,634,636, + 1,0,0,0,635,633,1,0,0,0,636,638,5,39,0,0,637,617,1,0,0,0,637,627,1,0,0, + 0,638,126,1,0,0,0,639,640,5,100,0,0,640,641,5,97,0,0,641,642,5,116,0,0, + 642,643,5,101,0,0,643,644,5,40,0,0,644,645,1,0,0,0,645,646,3,125,62,0,646, + 647,5,41,0,0,647,128,1,0,0,0,648,649,5,48,0,0,649,653,7,6,0,0,650,652,7, + 7,0,0,651,650,1,0,0,0,652,655,1,0,0,0,653,651,1,0,0,0,653,654,1,0,0,0,654, + 130,1,0,0,0,655,653,1,0,0,0,656,657,5,116,0,0,657,658,5,120,0,0,658,659, + 5,46,0,0,659,660,5,97,0,0,660,661,5,103,0,0,661,670,5,101,0,0,662,663,5, + 116,0,0,663,664,5,120,0,0,664,665,5,46,0,0,665,666,5,116,0,0,666,667,5, + 105,0,0,667,668,5,109,0,0,668,670,5,101,0,0,669,656,1,0,0,0,669,662,1,0, + 0,0,670,132,1,0,0,0,671,672,5,116,0,0,672,673,5,104,0,0,673,674,5,105,0, + 0,674,675,5,115,0,0,675,676,5,46,0,0,676,677,5,97,0,0,677,678,5,99,0,0, + 678,679,5,116,0,0,679,680,5,105,0,0,680,681,5,118,0,0,681,682,5,101,0,0, + 682,683,5,73,0,0,683,684,5,110,0,0,684,685,5,112,0,0,685,686,5,117,0,0, + 686,687,5,116,0,0,687,688,5,73,0,0,688,689,5,110,0,0,689,690,5,100,0,0, + 690,691,5,101,0,0,691,766,5,120,0,0,692,693,5,116,0,0,693,694,5,104,0,0, + 694,695,5,105,0,0,695,696,5,115,0,0,696,697,5,46,0,0,697,698,5,97,0,0,698, + 699,5,99,0,0,699,700,5,116,0,0,700,701,5,105,0,0,701,702,5,118,0,0,702, + 703,5,101,0,0,703,704,5,66,0,0,704,705,5,121,0,0,705,706,5,116,0,0,706, + 707,5,101,0,0,707,708,5,99,0,0,708,709,5,111,0,0,709,710,5,100,0,0,710, + 766,5,101,0,0,711,712,5,116,0,0,712,713,5,120,0,0,713,714,5,46,0,0,714, + 715,5,105,0,0,715,716,5,110,0,0,716,717,5,112,0,0,717,718,5,117,0,0,718, + 719,5,116,0,0,719,720,5,115,0,0,720,721,5,46,0,0,721,722,5,108,0,0,722, + 723,5,101,0,0,723,724,5,110,0,0,724,725,5,103,0,0,725,726,5,116,0,0,726, + 766,5,104,0,0,727,728,5,116,0,0,728,729,5,120,0,0,729,730,5,46,0,0,730, + 731,5,111,0,0,731,732,5,117,0,0,732,733,5,116,0,0,733,734,5,112,0,0,734, + 735,5,117,0,0,735,736,5,116,0,0,736,737,5,115,0,0,737,738,5,46,0,0,738, + 739,5,108,0,0,739,740,5,101,0,0,740,741,5,110,0,0,741,742,5,103,0,0,742, + 743,5,116,0,0,743,766,5,104,0,0,744,745,5,116,0,0,745,746,5,120,0,0,746, + 747,5,46,0,0,747,748,5,118,0,0,748,749,5,101,0,0,749,750,5,114,0,0,750, + 751,5,115,0,0,751,752,5,105,0,0,752,753,5,111,0,0,753,766,5,110,0,0,754, + 755,5,116,0,0,755,756,5,120,0,0,756,757,5,46,0,0,757,758,5,108,0,0,758, + 759,5,111,0,0,759,760,5,99,0,0,760,761,5,107,0,0,761,762,5,116,0,0,762, + 763,5,105,0,0,763,764,5,109,0,0,764,766,5,101,0,0,765,671,1,0,0,0,765,692, + 1,0,0,0,765,711,1,0,0,0,765,727,1,0,0,0,765,744,1,0,0,0,765,754,1,0,0,0, + 766,134,1,0,0,0,767,771,7,8,0,0,768,770,7,9,0,0,769,768,1,0,0,0,770,773, + 1,0,0,0,771,769,1,0,0,0,771,772,1,0,0,0,772,136,1,0,0,0,773,771,1,0,0,0, + 774,776,7,10,0,0,775,774,1,0,0,0,776,777,1,0,0,0,777,775,1,0,0,0,777,778, + 1,0,0,0,778,779,1,0,0,0,779,780,6,68,0,0,780,138,1,0,0,0,781,782,5,47,0, + 0,782,783,5,42,0,0,783,787,1,0,0,0,784,786,9,0,0,0,785,784,1,0,0,0,786, + 789,1,0,0,0,787,788,1,0,0,0,787,785,1,0,0,0,788,790,1,0,0,0,789,787,1,0, + 0,0,790,791,5,42,0,0,791,792,5,47,0,0,792,793,1,0,0,0,793,794,6,69,1,0, + 794,140,1,0,0,0,795,796,5,47,0,0,796,797,5,47,0,0,797,801,1,0,0,0,798,800, + 8,11,0,0,799,798,1,0,0,0,800,803,1,0,0,0,801,799,1,0,0,0,801,802,1,0,0, + 0,802,804,1,0,0,0,803,801,1,0,0,0,804,805,6,70,1,0,805,142,1,0,0,0,25,0, + 495,501,507,518,577,580,585,591,593,602,608,614,621,623,631,633,637,653, + 669,765,771,777,787,801,2,6,0,0,0,1,0]; + + private static __ATN: ATN; public static get _ATN(): ATN { if (!CashScriptLexer.__ATN) { - CashScriptLexer.__ATN = new ATNDeserializer().deserialize(Utils.toCharArray(CashScriptLexer._serializedATN)); + CashScriptLexer.__ATN = new ATNDeserializer().deserialize(CashScriptLexer._serializedATN); } return CashScriptLexer.__ATN; } -} + static DecisionsToDFA = CashScriptLexer._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) ); +} \ No newline at end of file diff --git a/packages/cashc/src/grammar/CashScriptParser.ts b/packages/cashc/src/grammar/CashScriptParser.ts index 0ea98f31..b9cf3939 100644 --- a/packages/cashc/src/grammar/CashScriptParser.ts +++ b/packages/cashc/src/grammar/CashScriptParser.ts @@ -1,32 +1,23 @@ -// Generated from src/grammar/CashScript.g4 by ANTLR 4.9.0-SNAPSHOT - - -import { ATN } from "antlr4ts/atn/ATN.js"; -import { ATNDeserializer } from "antlr4ts/atn/ATNDeserializer.js"; -import { FailedPredicateException } from "antlr4ts/FailedPredicateException.js"; -import { NotNull } from "antlr4ts/Decorators.js"; -import { NoViableAltException } from "antlr4ts/NoViableAltException.js"; -import { Override } from "antlr4ts/Decorators.js"; -import { Parser } from "antlr4ts/Parser.js"; -import { ParserRuleContext } from "antlr4ts/ParserRuleContext.js"; -import { ParserATNSimulator } from "antlr4ts/atn/ParserATNSimulator.js"; -import { ParseTreeListener } from "antlr4ts/tree/ParseTreeListener.js"; -import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor.js"; -import { RecognitionException } from "antlr4ts/RecognitionException.js"; -import { RuleContext } from "antlr4ts/RuleContext.js"; -//import { RuleVersion } from "antlr4ts/RuleVersion.js"; -import { TerminalNode } from "antlr4ts/tree/TerminalNode.js"; -import { Token } from "antlr4ts/Token.js"; -import { TokenStream } from "antlr4ts/TokenStream.js"; -import { Vocabulary } from "antlr4ts/Vocabulary.js"; -import { VocabularyImpl } from "antlr4ts/VocabularyImpl.js"; - -import * as Utils from "antlr4ts/misc/Utils.js"; - -import { CashScriptVisitor } from "./CashScriptVisitor.js"; - - -export class CashScriptParser extends Parser { +// Generated from src/grammar/CashScript.g4 by ANTLR 4.13.1 +// noinspection ES6UnusedImports,JSUnusedGlobalSymbols,JSUnusedLocalSymbols + +import { + ATN, + ATNDeserializer, DecisionState, DFA, FailedPredicateException, + RecognitionException, NoViableAltException, BailErrorStrategy, + Parser, ParserATNSimulator, + RuleContext, ParserRuleContext, PredictionMode, PredictionContextCache, + TerminalNode, RuleNode, + Token, TokenStream, + Interval, IntervalSet +} from 'antlr4'; +import CashScriptVisitor from "./CashScriptVisitor.js"; + +// for running tests with parameters, TODO: discuss strategy for typed parameters in CI +// eslint-disable-next-line no-unused-vars +type int = number; + +export default class CashScriptParser extends Parser { public static readonly T__0 = 1; public static readonly T__1 = 2; public static readonly T__2 = 3; @@ -98,6 +89,7 @@ export class CashScriptParser extends Parser { public static readonly WHITESPACE = 69; public static readonly COMMENT = 70; public static readonly LINE_COMMENT = 71; + public static readonly EOF = Token.EOF; public static readonly RULE_sourceFile = 0; public static readonly RULE_pragmaDirective = 1; public static readonly RULE_pragmaName = 2; @@ -123,6 +115,84 @@ export class CashScriptParser extends Parser { public static readonly RULE_literal = 22; public static readonly RULE_numberLiteral = 23; public static readonly RULE_typeName = 24; + public static readonly literalNames: (string | null)[] = [ null, "'pragma'", + "';'", "'cashscript'", + "'^'", "'~'", + "'>='", "'>'", + "'<'", "'<='", + "'='", "'contract'", + "'{'", "'}'", + "'function'", + "'('", "','", + "')'", "'require'", + "'if'", "'else'", + "'new'", "'['", + "']'", "'tx.outputs'", + "'.value'", + "'.lockingBytecode'", + "'.tokenCategory'", + "'.nftCommitment'", + "'.tokenAmount'", + "'tx.inputs'", + "'.outpointTransactionHash'", + "'.outpointIndex'", + "'.unlockingBytecode'", + "'.sequenceNumber'", + "'.reverse()'", + "'.length'", + "'.split'", + "'!'", "'-'", + "'*'", "'/'", + "'%'", "'+'", + "'=='", "'!='", + "'&'", "'|'", + "'&&'", "'||'", + "'constant'", + "'int'", "'bool'", + "'string'", + "'pubkey'", + "'sig'", "'datasig'" ]; + public static readonly symbolicNames: (string | null)[] = [ null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, "VersionLiteral", + "BooleanLiteral", + "NumberUnit", + "NumberLiteral", + "Bytes", "Bound", + "StringLiteral", + "DateLiteral", + "HexLiteral", + "TxVar", "NullaryOp", + "Identifier", + "WHITESPACE", + "COMMENT", + "LINE_COMMENT" ]; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "sourceFile", "pragmaDirective", "pragmaName", "pragmaValue", "versionConstraint", @@ -132,48 +202,11 @@ export class CashScriptParser extends Parser { "functionCall", "expressionList", "expression", "modifier", "literal", "numberLiteral", "typeName", ]; - - private static readonly _LITERAL_NAMES: Array = [ - undefined, "'pragma'", "';'", "'cashscript'", "'^'", "'~'", "'>='", "'>'", - "'<'", "'<='", "'='", "'contract'", "'{'", "'}'", "'function'", "'('", - "','", "')'", "'require'", "'if'", "'else'", "'new'", "'['", "']'", "'tx.outputs'", - "'.value'", "'.lockingBytecode'", "'.tokenCategory'", "'.nftCommitment'", - "'.tokenAmount'", "'tx.inputs'", "'.outpointTransactionHash'", "'.outpointIndex'", - "'.unlockingBytecode'", "'.sequenceNumber'", "'.reverse()'", "'.length'", - "'.split'", "'!'", "'-'", "'*'", "'/'", "'%'", "'+'", "'=='", "'!='", - "'&'", "'|'", "'&&'", "'||'", "'constant'", "'int'", "'bool'", "'string'", - "'pubkey'", "'sig'", "'datasig'", - ]; - private static readonly _SYMBOLIC_NAMES: Array = [ - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, undefined, undefined, undefined, undefined, undefined, undefined, - undefined, "VersionLiteral", "BooleanLiteral", "NumberUnit", "NumberLiteral", - "Bytes", "Bound", "StringLiteral", "DateLiteral", "HexLiteral", "TxVar", - "NullaryOp", "Identifier", "WHITESPACE", "COMMENT", "LINE_COMMENT", - ]; - public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(CashScriptParser._LITERAL_NAMES, CashScriptParser._SYMBOLIC_NAMES, []); - - // @Override - // @NotNull - public get vocabulary(): Vocabulary { - return CashScriptParser.VOCABULARY; - } - // tslint:enable:no-trailing-whitespace - - // @Override public get grammarFileName(): string { return "CashScript.g4"; } - - // @Override + public get literalNames(): (string | null)[] { return CashScriptParser.literalNames; } + public get symbolicNames(): (string | null)[] { return CashScriptParser.symbolicNames; } public get ruleNames(): string[] { return CashScriptParser.ruleNames; } - - // @Override - public get serializedATN(): string { return CashScriptParser._serializedATN; } + public get serializedATN(): number[] { return CashScriptParser._serializedATN; } protected createFailedPredicateException(predicate?: string, message?: string): FailedPredicateException { return new FailedPredicateException(this, predicate, message); @@ -181,20 +214,20 @@ export class CashScriptParser extends Parser { constructor(input: TokenStream) { super(input); - this._interp = new ParserATNSimulator(CashScriptParser._ATN, this); + this._interp = new ParserATNSimulator(this, CashScriptParser._ATN, CashScriptParser.DecisionsToDFA, new PredictionContextCache()); } // @RuleVersion(0) public sourceFile(): SourceFileContext { - let _localctx: SourceFileContext = new SourceFileContext(this._ctx, this.state); - this.enterRule(_localctx, 0, CashScriptParser.RULE_sourceFile); + let localctx: SourceFileContext = new SourceFileContext(this, this._ctx, this.state); + this.enterRule(localctx, 0, CashScriptParser.RULE_sourceFile); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 53; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === CashScriptParser.T__0) { + while (_la===1) { { { this.state = 50; @@ -213,7 +246,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -223,14 +256,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public pragmaDirective(): PragmaDirectiveContext { - let _localctx: PragmaDirectiveContext = new PragmaDirectiveContext(this._ctx, this.state); - this.enterRule(_localctx, 2, CashScriptParser.RULE_pragmaDirective); + let localctx: PragmaDirectiveContext = new PragmaDirectiveContext(this, this._ctx, this.state); + this.enterRule(localctx, 2, CashScriptParser.RULE_pragmaDirective); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 59; this.match(CashScriptParser.T__0); @@ -244,7 +277,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -254,14 +287,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public pragmaName(): PragmaNameContext { - let _localctx: PragmaNameContext = new PragmaNameContext(this._ctx, this.state); - this.enterRule(_localctx, 4, CashScriptParser.RULE_pragmaName); + let localctx: PragmaNameContext = new PragmaNameContext(this, this._ctx, this.state); + this.enterRule(localctx, 4, CashScriptParser.RULE_pragmaName); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 64; this.match(CashScriptParser.T__2); @@ -269,7 +302,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -279,22 +312,22 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public pragmaValue(): PragmaValueContext { - let _localctx: PragmaValueContext = new PragmaValueContext(this._ctx, this.state); - this.enterRule(_localctx, 6, CashScriptParser.RULE_pragmaValue); + let localctx: PragmaValueContext = new PragmaValueContext(this, this._ctx, this.state); + this.enterRule(localctx, 6, CashScriptParser.RULE_pragmaValue); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 66; this.versionConstraint(); this.state = 68; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__3) | (1 << CashScriptParser.T__4) | (1 << CashScriptParser.T__5) | (1 << CashScriptParser.T__6) | (1 << CashScriptParser.T__7) | (1 << CashScriptParser.T__8) | (1 << CashScriptParser.T__9))) !== 0) || _la === CashScriptParser.VersionLiteral) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2032) !== 0) || _la===57) { { this.state = 67; this.versionConstraint(); @@ -305,7 +338,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -315,20 +348,20 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public versionConstraint(): VersionConstraintContext { - let _localctx: VersionConstraintContext = new VersionConstraintContext(this._ctx, this.state); - this.enterRule(_localctx, 8, CashScriptParser.RULE_versionConstraint); + let localctx: VersionConstraintContext = new VersionConstraintContext(this, this._ctx, this.state); + this.enterRule(localctx, 8, CashScriptParser.RULE_versionConstraint); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 71; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__3) | (1 << CashScriptParser.T__4) | (1 << CashScriptParser.T__5) | (1 << CashScriptParser.T__6) | (1 << CashScriptParser.T__7) | (1 << CashScriptParser.T__8) | (1 << CashScriptParser.T__9))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2032) !== 0)) { { this.state = 70; this.versionOperator(); @@ -341,7 +374,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -351,33 +384,30 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public versionOperator(): VersionOperatorContext { - let _localctx: VersionOperatorContext = new VersionOperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 10, CashScriptParser.RULE_versionOperator); + let localctx: VersionOperatorContext = new VersionOperatorContext(this, this._ctx, this.state); + this.enterRule(localctx, 10, CashScriptParser.RULE_versionOperator); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 75; _la = this._input.LA(1); - if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__3) | (1 << CashScriptParser.T__4) | (1 << CashScriptParser.T__5) | (1 << CashScriptParser.T__6) | (1 << CashScriptParser.T__7) | (1 << CashScriptParser.T__8) | (1 << CashScriptParser.T__9))) !== 0))) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 2032) !== 0))) { this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } } } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -387,15 +417,15 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public contractDefinition(): ContractDefinitionContext { - let _localctx: ContractDefinitionContext = new ContractDefinitionContext(this._ctx, this.state); - this.enterRule(_localctx, 12, CashScriptParser.RULE_contractDefinition); + let localctx: ContractDefinitionContext = new ContractDefinitionContext(this, this._ctx, this.state); + this.enterRule(localctx, 12, CashScriptParser.RULE_contractDefinition); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 77; this.match(CashScriptParser.T__10); @@ -408,7 +438,7 @@ export class CashScriptParser extends Parser { this.state = 84; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === CashScriptParser.T__13) { + while (_la===14) { { { this.state = 81; @@ -425,7 +455,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -435,15 +465,15 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public functionDefinition(): FunctionDefinitionContext { - let _localctx: FunctionDefinitionContext = new FunctionDefinitionContext(this._ctx, this.state); - this.enterRule(_localctx, 14, CashScriptParser.RULE_functionDefinition); + let localctx: FunctionDefinitionContext = new FunctionDefinitionContext(this, this._ctx, this.state); + this.enterRule(localctx, 14, CashScriptParser.RULE_functionDefinition); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 89; this.match(CashScriptParser.T__13); @@ -456,7 +486,7 @@ export class CashScriptParser extends Parser { this.state = 96; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === CashScriptParser.T__17 || _la === CashScriptParser.T__18 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (CashScriptParser.T__50 - 51)) | (1 << (CashScriptParser.T__51 - 51)) | (1 << (CashScriptParser.T__52 - 51)) | (1 << (CashScriptParser.T__53 - 51)) | (1 << (CashScriptParser.T__54 - 51)) | (1 << (CashScriptParser.T__55 - 51)) | (1 << (CashScriptParser.Bytes - 51)) | (1 << (CashScriptParser.Identifier - 51)))) !== 0)) { + while (_la===18 || _la===19 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 132159) !== 0)) { { { this.state = 93; @@ -473,7 +503,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -483,29 +513,29 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public parameterList(): ParameterListContext { - let _localctx: ParameterListContext = new ParameterListContext(this._ctx, this.state); - this.enterRule(_localctx, 16, CashScriptParser.RULE_parameterList); + let localctx: ParameterListContext = new ParameterListContext(this, this._ctx, this.state); + this.enterRule(localctx, 16, CashScriptParser.RULE_parameterList); let _la: number; try { let _alt: number; - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 101; this.match(CashScriptParser.T__14); this.state = 113; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (CashScriptParser.T__50 - 51)) | (1 << (CashScriptParser.T__51 - 51)) | (1 << (CashScriptParser.T__52 - 51)) | (1 << (CashScriptParser.T__53 - 51)) | (1 << (CashScriptParser.T__54 - 51)) | (1 << (CashScriptParser.T__55 - 51)) | (1 << (CashScriptParser.Bytes - 51)))) !== 0)) { + if (((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 1087) !== 0)) { { this.state = 102; this.parameter(); this.state = 107; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 5, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 5, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { @@ -519,12 +549,12 @@ export class CashScriptParser extends Parser { } this.state = 109; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 5, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 5, this._ctx); } this.state = 111; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === CashScriptParser.T__15) { + if (_la===16) { { this.state = 110; this.match(CashScriptParser.T__15); @@ -540,7 +570,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -550,14 +580,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public parameter(): ParameterContext { - let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 18, CashScriptParser.RULE_parameter); + let localctx: ParameterContext = new ParameterContext(this, this._ctx, this.state); + this.enterRule(localctx, 18, CashScriptParser.RULE_parameter); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 117; this.typeName(); @@ -567,7 +597,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -577,26 +607,26 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public block(): BlockContext { - let _localctx: BlockContext = new BlockContext(this._ctx, this.state); - this.enterRule(_localctx, 20, CashScriptParser.RULE_block); + let localctx: BlockContext = new BlockContext(this, this._ctx, this.state); + this.enterRule(localctx, 20, CashScriptParser.RULE_block); let _la: number; try { this.state = 129; this._errHandler.sync(this); switch (this._input.LA(1)) { - case CashScriptParser.T__11: - this.enterOuterAlt(_localctx, 1); + case 12: + this.enterOuterAlt(localctx, 1); { this.state = 120; this.match(CashScriptParser.T__11); this.state = 124; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === CashScriptParser.T__17 || _la === CashScriptParser.T__18 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (CashScriptParser.T__50 - 51)) | (1 << (CashScriptParser.T__51 - 51)) | (1 << (CashScriptParser.T__52 - 51)) | (1 << (CashScriptParser.T__53 - 51)) | (1 << (CashScriptParser.T__54 - 51)) | (1 << (CashScriptParser.T__55 - 51)) | (1 << (CashScriptParser.Bytes - 51)) | (1 << (CashScriptParser.Identifier - 51)))) !== 0)) { + while (_la===18 || _la===19 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 132159) !== 0)) { { { this.state = 121; @@ -611,17 +641,17 @@ export class CashScriptParser extends Parser { this.match(CashScriptParser.T__12); } break; - case CashScriptParser.T__17: - case CashScriptParser.T__18: - case CashScriptParser.T__50: - case CashScriptParser.T__51: - case CashScriptParser.T__52: - case CashScriptParser.T__53: - case CashScriptParser.T__54: - case CashScriptParser.T__55: - case CashScriptParser.Bytes: - case CashScriptParser.Identifier: - this.enterOuterAlt(_localctx, 2); + case 18: + case 19: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 61: + case 68: + this.enterOuterAlt(localctx, 2); { this.state = 128; this.statement(); @@ -633,7 +663,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -643,58 +673,53 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public statement(): StatementContext { - let _localctx: StatementContext = new StatementContext(this._ctx, this.state); - this.enterRule(_localctx, 22, CashScriptParser.RULE_statement); + let localctx: StatementContext = new StatementContext(this, this._ctx, this.state); + this.enterRule(localctx, 22, CashScriptParser.RULE_statement); try { this.state = 137; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 10, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 10, this._ctx) ) { case 1: - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 131; this.variableDefinition(); } break; - case 2: - this.enterOuterAlt(_localctx, 2); + this.enterOuterAlt(localctx, 2); { this.state = 132; this.tupleAssignment(); } break; - case 3: - this.enterOuterAlt(_localctx, 3); + this.enterOuterAlt(localctx, 3); { this.state = 133; this.assignStatement(); } break; - case 4: - this.enterOuterAlt(_localctx, 4); + this.enterOuterAlt(localctx, 4); { this.state = 134; this.timeOpStatement(); } break; - case 5: - this.enterOuterAlt(_localctx, 5); + this.enterOuterAlt(localctx, 5); { this.state = 135; this.requireStatement(); } break; - case 6: - this.enterOuterAlt(_localctx, 6); + this.enterOuterAlt(localctx, 6); { this.state = 136; this.ifStatement(); @@ -704,7 +729,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -714,22 +739,22 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public variableDefinition(): VariableDefinitionContext { - let _localctx: VariableDefinitionContext = new VariableDefinitionContext(this._ctx, this.state); - this.enterRule(_localctx, 24, CashScriptParser.RULE_variableDefinition); + let localctx: VariableDefinitionContext = new VariableDefinitionContext(this, this._ctx, this.state); + this.enterRule(localctx, 24, CashScriptParser.RULE_variableDefinition); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 139; this.typeName(); this.state = 143; this._errHandler.sync(this); _la = this._input.LA(1); - while (_la === CashScriptParser.T__49) { + while (_la===50) { { { this.state = 140; @@ -752,7 +777,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -762,14 +787,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public tupleAssignment(): TupleAssignmentContext { - let _localctx: TupleAssignmentContext = new TupleAssignmentContext(this._ctx, this.state); - this.enterRule(_localctx, 26, CashScriptParser.RULE_tupleAssignment); + let localctx: TupleAssignmentContext = new TupleAssignmentContext(this, this._ctx, this.state); + this.enterRule(localctx, 26, CashScriptParser.RULE_tupleAssignment); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 151; this.typeName(); @@ -791,7 +816,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -801,14 +826,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public assignStatement(): AssignStatementContext { - let _localctx: AssignStatementContext = new AssignStatementContext(this._ctx, this.state); - this.enterRule(_localctx, 28, CashScriptParser.RULE_assignStatement); + let localctx: AssignStatementContext = new AssignStatementContext(this, this._ctx, this.state); + this.enterRule(localctx, 28, CashScriptParser.RULE_assignStatement); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 160; this.match(CashScriptParser.Identifier); @@ -822,7 +847,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -832,14 +857,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public timeOpStatement(): TimeOpStatementContext { - let _localctx: TimeOpStatementContext = new TimeOpStatementContext(this._ctx, this.state); - this.enterRule(_localctx, 30, CashScriptParser.RULE_timeOpStatement); + let localctx: TimeOpStatementContext = new TimeOpStatementContext(this, this._ctx, this.state); + this.enterRule(localctx, 30, CashScriptParser.RULE_timeOpStatement); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 165; this.match(CashScriptParser.T__17); @@ -859,7 +884,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -869,14 +894,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public requireStatement(): RequireStatementContext { - let _localctx: RequireStatementContext = new RequireStatementContext(this._ctx, this.state); - this.enterRule(_localctx, 32, CashScriptParser.RULE_requireStatement); + let localctx: RequireStatementContext = new RequireStatementContext(this, this._ctx, this.state); + this.enterRule(localctx, 32, CashScriptParser.RULE_requireStatement); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 173; this.match(CashScriptParser.T__17); @@ -892,7 +917,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -902,14 +927,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public ifStatement(): IfStatementContext { - let _localctx: IfStatementContext = new IfStatementContext(this._ctx, this.state); - this.enterRule(_localctx, 34, CashScriptParser.RULE_ifStatement); + let localctx: IfStatementContext = new IfStatementContext(this, this._ctx, this.state); + this.enterRule(localctx, 34, CashScriptParser.RULE_ifStatement); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 179; this.match(CashScriptParser.T__18); @@ -920,16 +945,16 @@ export class CashScriptParser extends Parser { this.state = 182; this.match(CashScriptParser.T__16); this.state = 183; - _localctx._ifBlock = this.block(); + localctx._ifBlock = this.block(); this.state = 186; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 12, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: { this.state = 184; this.match(CashScriptParser.T__19); this.state = 185; - _localctx._elseBlock = this.block(); + localctx._elseBlock = this.block(); } break; } @@ -937,7 +962,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -947,14 +972,14 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public functionCall(): FunctionCallContext { - let _localctx: FunctionCallContext = new FunctionCallContext(this._ctx, this.state); - this.enterRule(_localctx, 36, CashScriptParser.RULE_functionCall); + let localctx: FunctionCallContext = new FunctionCallContext(this, this._ctx, this.state); + this.enterRule(localctx, 36, CashScriptParser.RULE_functionCall); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 188; this.match(CashScriptParser.Identifier); @@ -964,7 +989,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -974,29 +999,29 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public expressionList(): ExpressionListContext { - let _localctx: ExpressionListContext = new ExpressionListContext(this._ctx, this.state); - this.enterRule(_localctx, 38, CashScriptParser.RULE_expressionList); + let localctx: ExpressionListContext = new ExpressionListContext(this, this._ctx, this.state); + this.enterRule(localctx, 38, CashScriptParser.RULE_expressionList); let _la: number; try { let _alt: number; - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 191; this.match(CashScriptParser.T__14); this.state = 203; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__14) | (1 << CashScriptParser.T__20) | (1 << CashScriptParser.T__21) | (1 << CashScriptParser.T__23) | (1 << CashScriptParser.T__29))) !== 0) || ((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & ((1 << (CashScriptParser.T__37 - 38)) | (1 << (CashScriptParser.T__38 - 38)) | (1 << (CashScriptParser.T__50 - 38)) | (1 << (CashScriptParser.T__51 - 38)) | (1 << (CashScriptParser.T__52 - 38)) | (1 << (CashScriptParser.T__53 - 38)) | (1 << (CashScriptParser.T__54 - 38)) | (1 << (CashScriptParser.T__55 - 38)) | (1 << (CashScriptParser.BooleanLiteral - 38)) | (1 << (CashScriptParser.NumberLiteral - 38)) | (1 << (CashScriptParser.Bytes - 38)) | (1 << (CashScriptParser.StringLiteral - 38)) | (1 << (CashScriptParser.DateLiteral - 38)) | (1 << (CashScriptParser.HexLiteral - 38)) | (1 << (CashScriptParser.NullaryOp - 38)) | (1 << (CashScriptParser.Identifier - 38)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 1096843264) !== 0) || ((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 1859641347) !== 0)) { { this.state = 192; this.expression(0); this.state = 197; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 13, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 13, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { @@ -1010,12 +1035,12 @@ export class CashScriptParser extends Parser { } this.state = 199; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 13, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 13, this._ctx); } this.state = 201; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === CashScriptParser.T__15) { + if (_la===16) { { this.state = 200; this.match(CashScriptParser.T__15); @@ -1031,7 +1056,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -1041,7 +1066,7 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } public expression(): ExpressionContext; @@ -1054,23 +1079,23 @@ export class CashScriptParser extends Parser { let _parentctx: ParserRuleContext = this._ctx; let _parentState: number = this.state; - let _localctx: ExpressionContext = new ExpressionContext(this._ctx, _parentState); - let _prevctx: ExpressionContext = _localctx; + let localctx: ExpressionContext = new ExpressionContext(this, this._ctx, _parentState); + let _prevctx: ExpressionContext = localctx; let _startState: number = 40; - this.enterRecursionRule(_localctx, 40, CashScriptParser.RULE_expression, _p); + this.enterRecursionRule(localctx, 40, CashScriptParser.RULE_expression, _p); let _la: number; try { let _alt: number; - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 260; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 21, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { case 1: { - _localctx = new ParenthesisedContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new ParenthesisedContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 208; this.match(CashScriptParser.T__14); @@ -1080,34 +1105,33 @@ export class CashScriptParser extends Parser { this.match(CashScriptParser.T__16); } break; - case 2: { - _localctx = new CastContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new CastContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 212; this.typeName(); this.state = 213; this.match(CashScriptParser.T__14); this.state = 214; - (_localctx as CastContext)._castable = this.expression(0); + (localctx as CastContext)._castable = this.expression(0); this.state = 217; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 16, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: { this.state = 215; this.match(CashScriptParser.T__15); this.state = 216; - (_localctx as CastContext)._size = this.expression(0); + (localctx as CastContext)._size = this.expression(0); } break; } this.state = 220; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === CashScriptParser.T__15) { + if (_la===16) { { this.state = 219; this.match(CashScriptParser.T__15); @@ -1118,22 +1142,20 @@ export class CashScriptParser extends Parser { this.match(CashScriptParser.T__16); } break; - case 3: { - _localctx = new FunctionCallExpressionContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new FunctionCallExpressionContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 224; this.functionCall(); } break; - case 4: { - _localctx = new InstantiationContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new InstantiationContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 225; this.match(CashScriptParser.T__20); this.state = 226; @@ -1142,14 +1164,13 @@ export class CashScriptParser extends Parser { this.expressionList(); } break; - case 5: { - _localctx = new UnaryIntrospectionOpContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new UnaryIntrospectionOpContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 228; - (_localctx as UnaryIntrospectionOpContext)._scope = this.match(CashScriptParser.T__23); + (localctx as UnaryIntrospectionOpContext)._scope = this.match(CashScriptParser.T__23); this.state = 229; this.match(CashScriptParser.T__21); this.state = 230; @@ -1157,28 +1178,24 @@ export class CashScriptParser extends Parser { this.state = 231; this.match(CashScriptParser.T__22); this.state = 232; - (_localctx as UnaryIntrospectionOpContext)._op = this._input.LT(1); + (localctx as UnaryIntrospectionOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__24) | (1 << CashScriptParser.T__25) | (1 << CashScriptParser.T__26) | (1 << CashScriptParser.T__27) | (1 << CashScriptParser.T__28))) !== 0))) { - (_localctx as UnaryIntrospectionOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 1040187392) !== 0))) { + (localctx as UnaryIntrospectionOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } } break; - case 6: { - _localctx = new UnaryIntrospectionOpContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new UnaryIntrospectionOpContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 234; - (_localctx as UnaryIntrospectionOpContext)._scope = this.match(CashScriptParser.T__29); + (localctx as UnaryIntrospectionOpContext)._scope = this.match(CashScriptParser.T__29); this.state = 235; this.match(CashScriptParser.T__21); this.state = 236; @@ -1186,61 +1203,53 @@ export class CashScriptParser extends Parser { this.state = 237; this.match(CashScriptParser.T__22); this.state = 238; - (_localctx as UnaryIntrospectionOpContext)._op = this._input.LT(1); + (localctx as UnaryIntrospectionOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 25)) & ~0x1F) === 0 && ((1 << (_la - 25)) & ((1 << (CashScriptParser.T__24 - 25)) | (1 << (CashScriptParser.T__25 - 25)) | (1 << (CashScriptParser.T__26 - 25)) | (1 << (CashScriptParser.T__27 - 25)) | (1 << (CashScriptParser.T__28 - 25)) | (1 << (CashScriptParser.T__30 - 25)) | (1 << (CashScriptParser.T__31 - 25)) | (1 << (CashScriptParser.T__32 - 25)) | (1 << (CashScriptParser.T__33 - 25)))) !== 0))) { - (_localctx as UnaryIntrospectionOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(((((_la - 25)) & ~0x1F) === 0 && ((1 << (_la - 25)) & 991) !== 0))) { + (localctx as UnaryIntrospectionOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } } break; - case 7: { - _localctx = new UnaryOpContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new UnaryOpContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 240; - (_localctx as UnaryOpContext)._op = this._input.LT(1); + (localctx as UnaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(_la === CashScriptParser.T__37 || _la === CashScriptParser.T__38)) { - (_localctx as UnaryOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(_la===38 || _la===39)) { + (localctx as UnaryOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 241; this.expression(14); } break; - case 8: { - _localctx = new ArrayContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new ArrayContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 242; this.match(CashScriptParser.T__21); this.state = 254; this._errHandler.sync(this); _la = this._input.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__14) | (1 << CashScriptParser.T__20) | (1 << CashScriptParser.T__21) | (1 << CashScriptParser.T__23) | (1 << CashScriptParser.T__29))) !== 0) || ((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & ((1 << (CashScriptParser.T__37 - 38)) | (1 << (CashScriptParser.T__38 - 38)) | (1 << (CashScriptParser.T__50 - 38)) | (1 << (CashScriptParser.T__51 - 38)) | (1 << (CashScriptParser.T__52 - 38)) | (1 << (CashScriptParser.T__53 - 38)) | (1 << (CashScriptParser.T__54 - 38)) | (1 << (CashScriptParser.T__55 - 38)) | (1 << (CashScriptParser.BooleanLiteral - 38)) | (1 << (CashScriptParser.NumberLiteral - 38)) | (1 << (CashScriptParser.Bytes - 38)) | (1 << (CashScriptParser.StringLiteral - 38)) | (1 << (CashScriptParser.DateLiteral - 38)) | (1 << (CashScriptParser.HexLiteral - 38)) | (1 << (CashScriptParser.NullaryOp - 38)) | (1 << (CashScriptParser.Identifier - 38)))) !== 0)) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 1096843264) !== 0) || ((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 1859641347) !== 0)) { { this.state = 243; this.expression(0); this.state = 248; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 18, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 18, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { @@ -1254,12 +1263,12 @@ export class CashScriptParser extends Parser { } this.state = 250; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 18, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 18, this._ctx); } this.state = 252; this._errHandler.sync(this); _la = this._input.LA(1); - if (_la === CashScriptParser.T__15) { + if (_la===16) { { this.state = 251; this.match(CashScriptParser.T__15); @@ -1273,243 +1282,219 @@ export class CashScriptParser extends Parser { this.match(CashScriptParser.T__22); } break; - case 9: { - _localctx = new NullaryOpContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new NullaryOpContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 257; this.match(CashScriptParser.NullaryOp); } break; - case 10: { - _localctx = new IdentifierContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new IdentifierContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 258; this.match(CashScriptParser.Identifier); } break; - case 11: { - _localctx = new LiteralExpressionContext(_localctx); - this._ctx = _localctx; - _prevctx = _localctx; + localctx = new LiteralExpressionContext(this, localctx); + this._ctx = localctx; + _prevctx = localctx; this.state = 259; this.literal(); } break; } - this._ctx._stop = this._input.tryLT(-1); + this._ctx.stop = this._input.LT(-1); this.state = 303; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 23, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 23, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { this.triggerExitRuleEvent(); } - _prevctx = _localctx; + _prevctx = localctx; { this.state = 301; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 22, this._ctx) ) { case 1: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 262; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } this.state = 263; - (_localctx as BinaryOpContext)._op = this._input.LT(1); + (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (CashScriptParser.T__39 - 40)) | (1 << (CashScriptParser.T__40 - 40)) | (1 << (CashScriptParser.T__41 - 40)))) !== 0))) { - (_localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & 7) !== 0))) { + (localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 264; - (_localctx as BinaryOpContext)._right = this.expression(14); + (localctx as BinaryOpContext)._right = this.expression(14); } break; - case 2: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 265; if (!(this.precpred(this._ctx, 12))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); } this.state = 266; - (_localctx as BinaryOpContext)._op = this._input.LT(1); + (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(_la === CashScriptParser.T__38 || _la === CashScriptParser.T__42)) { - (_localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(_la===39 || _la===43)) { + (localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 267; - (_localctx as BinaryOpContext)._right = this.expression(13); + (localctx as BinaryOpContext)._right = this.expression(13); } break; - case 3: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 268; if (!(this.precpred(this._ctx, 11))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 11)"); } this.state = 269; - (_localctx as BinaryOpContext)._op = this._input.LT(1); + (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << CashScriptParser.T__5) | (1 << CashScriptParser.T__6) | (1 << CashScriptParser.T__7) | (1 << CashScriptParser.T__8))) !== 0))) { - (_localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 960) !== 0))) { + (localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 270; - (_localctx as BinaryOpContext)._right = this.expression(12); + (localctx as BinaryOpContext)._right = this.expression(12); } break; - case 4: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 271; if (!(this.precpred(this._ctx, 10))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 10)"); } this.state = 272; - (_localctx as BinaryOpContext)._op = this._input.LT(1); + (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(_la === CashScriptParser.T__43 || _la === CashScriptParser.T__44)) { - (_localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(_la===44 || _la===45)) { + (localctx as BinaryOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } this.state = 273; - (_localctx as BinaryOpContext)._right = this.expression(11); + (localctx as BinaryOpContext)._right = this.expression(11); } break; - case 5: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 274; if (!(this.precpred(this._ctx, 9))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 9)"); } this.state = 275; - (_localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__45); + (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__45); this.state = 276; - (_localctx as BinaryOpContext)._right = this.expression(10); + (localctx as BinaryOpContext)._right = this.expression(10); } break; - case 6: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 277; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } this.state = 278; - (_localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__3); + (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__3); this.state = 279; - (_localctx as BinaryOpContext)._right = this.expression(9); + (localctx as BinaryOpContext)._right = this.expression(9); } break; - case 7: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 280; if (!(this.precpred(this._ctx, 7))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 7)"); } this.state = 281; - (_localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__46); + (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__46); this.state = 282; - (_localctx as BinaryOpContext)._right = this.expression(8); + (localctx as BinaryOpContext)._right = this.expression(8); } break; - case 8: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 283; if (!(this.precpred(this._ctx, 6))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 6)"); } this.state = 284; - (_localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__47); + (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__47); this.state = 285; - (_localctx as BinaryOpContext)._right = this.expression(7); + (localctx as BinaryOpContext)._right = this.expression(7); } break; - case 9: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 286; if (!(this.precpred(this._ctx, 5))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 5)"); } this.state = 287; - (_localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__48); + (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__48); this.state = 288; - (_localctx as BinaryOpContext)._right = this.expression(6); + (localctx as BinaryOpContext)._right = this.expression(6); } break; - case 10: { - _localctx = new TupleIndexOpContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new TupleIndexOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 289; if (!(this.precpred(this._ctx, 19))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); @@ -1517,51 +1502,46 @@ export class CashScriptParser extends Parser { this.state = 290; this.match(CashScriptParser.T__21); this.state = 291; - (_localctx as TupleIndexOpContext)._index = this.match(CashScriptParser.NumberLiteral); + (localctx as TupleIndexOpContext)._index = this.match(CashScriptParser.NumberLiteral); this.state = 292; this.match(CashScriptParser.T__22); } break; - case 11: { - _localctx = new UnaryOpContext(new ExpressionContext(_parentctx, _parentState)); - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new UnaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 293; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } this.state = 294; - (_localctx as UnaryOpContext)._op = this._input.LT(1); + (localctx as UnaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); - if (!(_la === CashScriptParser.T__34 || _la === CashScriptParser.T__35)) { - (_localctx as UnaryOpContext)._op = this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + if(!(_la===35 || _la===36)) { + (localctx as UnaryOpContext)._op = this._errHandler.recoverInline(this); + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } } break; - case 12: { - _localctx = new BinaryOpContext(new ExpressionContext(_parentctx, _parentState)); - (_localctx as BinaryOpContext)._left = _prevctx; - this.pushNewRecursionContext(_localctx, _startState, CashScriptParser.RULE_expression); + localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); + (localctx as BinaryOpContext)._left = _prevctx; + this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); this.state = 295; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } this.state = 296; - (_localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__36); + (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__36); this.state = 297; this.match(CashScriptParser.T__14); this.state = 298; - (_localctx as BinaryOpContext)._right = this.expression(0); + (localctx as BinaryOpContext)._right = this.expression(0); this.state = 299; this.match(CashScriptParser.T__16); } @@ -1571,13 +1551,13 @@ export class CashScriptParser extends Parser { } this.state = 305; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 23, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 23, this._ctx); } } } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -1587,14 +1567,14 @@ export class CashScriptParser extends Parser { finally { this.unrollRecursionContexts(_parentctx); } - return _localctx; + return localctx; } // @RuleVersion(0) public modifier(): ModifierContext { - let _localctx: ModifierContext = new ModifierContext(this._ctx, this.state); - this.enterRule(_localctx, 42, CashScriptParser.RULE_modifier); + let localctx: ModifierContext = new ModifierContext(this, this._ctx, this.state); + this.enterRule(localctx, 42, CashScriptParser.RULE_modifier); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 306; this.match(CashScriptParser.T__49); @@ -1602,7 +1582,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -1612,46 +1592,46 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public literal(): LiteralContext { - let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 44, CashScriptParser.RULE_literal); + let localctx: LiteralContext = new LiteralContext(this, this._ctx, this.state); + this.enterRule(localctx, 44, CashScriptParser.RULE_literal); try { this.state = 313; this._errHandler.sync(this); switch (this._input.LA(1)) { - case CashScriptParser.BooleanLiteral: - this.enterOuterAlt(_localctx, 1); + case 58: + this.enterOuterAlt(localctx, 1); { this.state = 308; this.match(CashScriptParser.BooleanLiteral); } break; - case CashScriptParser.NumberLiteral: - this.enterOuterAlt(_localctx, 2); + case 60: + this.enterOuterAlt(localctx, 2); { this.state = 309; this.numberLiteral(); } break; - case CashScriptParser.StringLiteral: - this.enterOuterAlt(_localctx, 3); + case 63: + this.enterOuterAlt(localctx, 3); { this.state = 310; this.match(CashScriptParser.StringLiteral); } break; - case CashScriptParser.DateLiteral: - this.enterOuterAlt(_localctx, 4); + case 64: + this.enterOuterAlt(localctx, 4); { this.state = 311; this.match(CashScriptParser.DateLiteral); } break; - case CashScriptParser.HexLiteral: - this.enterOuterAlt(_localctx, 5); + case 65: + this.enterOuterAlt(localctx, 5); { this.state = 312; this.match(CashScriptParser.HexLiteral); @@ -1663,7 +1643,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -1673,20 +1653,20 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public numberLiteral(): NumberLiteralContext { - let _localctx: NumberLiteralContext = new NumberLiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 46, CashScriptParser.RULE_numberLiteral); + let localctx: NumberLiteralContext = new NumberLiteralContext(this, this._ctx, this.state); + this.enterRule(localctx, 46, CashScriptParser.RULE_numberLiteral); try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 315; this.match(CashScriptParser.NumberLiteral); this.state = 317; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 25, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 25, this._ctx) ) { case 1: { this.state = 316; @@ -1698,7 +1678,7 @@ export class CashScriptParser extends Parser { } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -1708,33 +1688,30 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } // @RuleVersion(0) public typeName(): TypeNameContext { - let _localctx: TypeNameContext = new TypeNameContext(this._ctx, this.state); - this.enterRule(_localctx, 48, CashScriptParser.RULE_typeName); + let localctx: TypeNameContext = new TypeNameContext(this, this._ctx, this.state); + this.enterRule(localctx, 48, CashScriptParser.RULE_typeName); let _la: number; try { - this.enterOuterAlt(_localctx, 1); + this.enterOuterAlt(localctx, 1); { this.state = 319; _la = this._input.LA(1); - if (!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & ((1 << (CashScriptParser.T__50 - 51)) | (1 << (CashScriptParser.T__51 - 51)) | (1 << (CashScriptParser.T__52 - 51)) | (1 << (CashScriptParser.T__53 - 51)) | (1 << (CashScriptParser.T__54 - 51)) | (1 << (CashScriptParser.T__55 - 51)) | (1 << (CashScriptParser.Bytes - 51)))) !== 0))) { + if(!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 1087) !== 0))) { this._errHandler.recoverInline(this); - } else { - if (this._input.LA(1) === Token.EOF) { - this.matchedEOF = true; - } - + } + else { this._errHandler.reportMatch(this); - this.consume(); + this.consume(); } } } catch (re) { if (re instanceof RecognitionException) { - _localctx.exception = re; + localctx.exception = re; this._errHandler.reportError(this, re); this._errHandler.recover(this, re); } else { @@ -1744,240 +1721,187 @@ export class CashScriptParser extends Parser { finally { this.exitRule(); } - return _localctx; + return localctx; } - public sempred(_localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { + public sempred(localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { case 20: - return this.expression_sempred(_localctx as ExpressionContext, predIndex); + return this.expression_sempred(localctx as ExpressionContext, predIndex); } return true; } - private expression_sempred(_localctx: ExpressionContext, predIndex: number): boolean { + private expression_sempred(localctx: ExpressionContext, predIndex: number): boolean { switch (predIndex) { case 0: return this.precpred(this._ctx, 13); - case 1: return this.precpred(this._ctx, 12); - case 2: return this.precpred(this._ctx, 11); - case 3: return this.precpred(this._ctx, 10); - case 4: return this.precpred(this._ctx, 9); - case 5: return this.precpred(this._ctx, 8); - case 6: return this.precpred(this._ctx, 7); - case 7: return this.precpred(this._ctx, 6); - case 8: return this.precpred(this._ctx, 5); - case 9: return this.precpred(this._ctx, 19); - case 10: return this.precpred(this._ctx, 16); - case 11: return this.precpred(this._ctx, 15); } return true; } - public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03I\u0144\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\x03\x02\x07\x026\n\x02\f\x02\x0E" + - "\x029\v\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03" + - "\x03\x03\x04\x03\x04\x03\x05\x03\x05\x05\x05G\n\x05\x03\x06\x05\x06J\n" + - "\x06\x03\x06\x03\x06\x03\x07\x03\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x07" + - "\bU\n\b\f\b\x0E\bX\v\b\x03\b\x03\b\x03\t\x03\t\x03\t\x03\t\x03\t\x07\t" + - "a\n\t\f\t\x0E\td\v\t\x03\t\x03\t\x03\n\x03\n\x03\n\x03\n\x07\nl\n\n\f" + - "\n\x0E\no\v\n\x03\n\x05\nr\n\n\x05\nt\n\n\x03\n\x03\n\x03\v\x03\v\x03" + - "\v\x03\f\x03\f\x07\f}\n\f\f\f\x0E\f\x80\v\f\x03\f\x03\f\x05\f\x84\n\f" + - "\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\x8C\n\r\x03\x0E\x03\x0E\x07" + - "\x0E\x90\n\x0E\f\x0E\x0E\x0E\x93\v\x0E\x03\x0E\x03\x0E\x03\x0E\x03\x0E" + - "\x03\x0E\x03\x0F\x03\x0F\x03\x0F\x03\x0F\x03\x0F\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\x11\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13" + - "\x05\x13\xBD\n\x13\x03\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15\x03" + - "\x15\x07\x15\xC6\n\x15\f\x15\x0E\x15\xC9\v\x15\x03\x15\x05\x15\xCC\n\x15" + - "\x05\x15\xCE\n\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\xDC\n\x16\x03\x16" + - "\x05\x16\xDF\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07" + - "\x16\xF9\n\x16\f\x16\x0E\x16\xFC\v\x16\x03\x16\x05\x16\xFF\n\x16\x05\x16" + - "\u0101\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u0107\n\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x07\x16\u0130\n\x16\f\x16\x0E\x16\u0133\v\x16\x03\x17" + - "\x03\x17\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18\u013C\n\x18\x03" + - "\x19\x03\x19\x05\x19\u0140\n\x19\x03\x1A\x03\x1A\x03\x1A\x02\x02\x03*" + - "\x1B\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\x02\x02\f\x03\x02\x06\f\x03\x02\x1B\x1F\x04" + - "\x02\x1B\x1F!$\x03\x02()\x03\x02*,\x04\x02))--\x03\x02\b\v\x03\x02./\x03" + - "\x02%&\x04\x025:??\x02\u015E\x027\x03\x02\x02\x02\x04=\x03\x02\x02\x02" + - "\x06B\x03\x02\x02\x02\bD\x03\x02\x02\x02\nI\x03\x02\x02\x02\fM\x03\x02" + - "\x02\x02\x0EO\x03\x02\x02\x02\x10[\x03\x02\x02\x02\x12g\x03\x02\x02\x02" + - "\x14w\x03\x02\x02\x02\x16\x83\x03\x02\x02\x02\x18\x8B\x03\x02\x02\x02" + - "\x1A\x8D\x03\x02\x02\x02\x1C\x99\x03\x02\x02\x02\x1E\xA2\x03\x02\x02\x02" + - " \xA7\x03\x02\x02\x02\"\xAF\x03\x02\x02\x02$\xB5\x03\x02\x02\x02&\xBE" + - "\x03\x02\x02\x02(\xC1\x03\x02\x02\x02*\u0106\x03\x02\x02\x02,\u0134\x03" + - "\x02\x02\x02.\u013B\x03\x02\x02\x020\u013D\x03\x02\x02\x022\u0141\x03" + - "\x02\x02\x0246\x05\x04\x03\x0254\x03\x02\x02\x0269\x03\x02\x02\x0275\x03" + - "\x02\x02\x0278\x03\x02\x02\x028:\x03\x02\x02\x0297\x03\x02\x02\x02:;\x05" + - "\x0E\b\x02;<\x07\x02\x02\x03<\x03\x03\x02\x02\x02=>\x07\x03\x02\x02>?" + - "\x05\x06\x04\x02?@\x05\b\x05\x02@A\x07\x04\x02\x02A\x05\x03\x02\x02\x02" + - "BC\x07\x05\x02\x02C\x07\x03\x02\x02\x02DF\x05\n\x06\x02EG\x05\n\x06\x02" + - "FE\x03\x02\x02\x02FG\x03\x02\x02\x02G\t\x03\x02\x02\x02HJ\x05\f\x07\x02" + - "IH\x03\x02\x02\x02IJ\x03\x02\x02\x02JK\x03\x02\x02\x02KL\x07;\x02\x02" + - "L\v\x03\x02\x02\x02MN\t\x02\x02\x02N\r\x03\x02\x02\x02OP\x07\r\x02\x02" + - "PQ\x07F\x02\x02QR\x05\x12\n\x02RV\x07\x0E\x02\x02SU\x05\x10\t\x02TS\x03" + - "\x02\x02\x02UX\x03\x02\x02\x02VT\x03\x02\x02\x02VW\x03\x02\x02\x02WY\x03" + - "\x02\x02\x02XV\x03\x02\x02\x02YZ\x07\x0F\x02\x02Z\x0F\x03\x02\x02\x02" + - "[\\\x07\x10\x02\x02\\]\x07F\x02\x02]^\x05\x12\n\x02^b\x07\x0E\x02\x02" + - "_a\x05\x18\r\x02`_\x03\x02\x02\x02ad\x03\x02\x02\x02b`\x03\x02\x02\x02" + - "bc\x03\x02\x02\x02ce\x03\x02\x02\x02db\x03\x02\x02\x02ef\x07\x0F\x02\x02" + - "f\x11\x03\x02\x02\x02gs\x07\x11\x02\x02hm\x05\x14\v\x02ij\x07\x12\x02" + - "\x02jl\x05\x14\v\x02ki\x03\x02\x02\x02lo\x03\x02\x02\x02mk\x03\x02\x02" + - "\x02mn\x03\x02\x02\x02nq\x03\x02\x02\x02om\x03\x02\x02\x02pr\x07\x12\x02" + - "\x02qp\x03\x02\x02\x02qr\x03\x02\x02\x02rt\x03\x02\x02\x02sh\x03\x02\x02" + - "\x02st\x03\x02\x02\x02tu\x03\x02\x02\x02uv\x07\x13\x02\x02v\x13\x03\x02" + - "\x02\x02wx\x052\x1A\x02xy\x07F\x02\x02y\x15\x03\x02\x02\x02z~\x07\x0E" + - "\x02\x02{}\x05\x18\r\x02|{\x03\x02\x02\x02}\x80\x03\x02\x02\x02~|\x03" + - "\x02\x02\x02~\x7F\x03\x02\x02\x02\x7F\x81\x03\x02\x02\x02\x80~\x03\x02" + - "\x02\x02\x81\x84\x07\x0F\x02\x02\x82\x84\x05\x18\r\x02\x83z\x03\x02\x02" + - "\x02\x83\x82\x03\x02\x02\x02\x84\x17\x03\x02\x02\x02\x85\x8C\x05\x1A\x0E" + - "\x02\x86\x8C\x05\x1C\x0F\x02\x87\x8C\x05\x1E\x10\x02\x88\x8C\x05 \x11" + - "\x02\x89\x8C\x05\"\x12\x02\x8A\x8C\x05$\x13\x02\x8B\x85\x03\x02\x02\x02" + - "\x8B\x86\x03\x02\x02\x02\x8B\x87\x03\x02\x02\x02\x8B\x88\x03\x02\x02\x02" + - "\x8B\x89\x03\x02\x02\x02\x8B\x8A\x03\x02\x02\x02\x8C\x19\x03\x02\x02\x02" + - "\x8D\x91\x052\x1A\x02\x8E\x90\x05,\x17\x02\x8F\x8E\x03\x02\x02\x02\x90" + - "\x93\x03\x02\x02\x02\x91\x8F\x03\x02\x02\x02\x91\x92\x03\x02\x02\x02\x92" + - "\x94\x03\x02\x02\x02\x93\x91\x03\x02\x02\x02\x94\x95\x07F\x02\x02\x95" + - "\x96\x07\f\x02\x02\x96\x97\x05*\x16\x02\x97\x98\x07\x04\x02\x02\x98\x1B" + - "\x03\x02\x02\x02\x99\x9A\x052\x1A\x02\x9A\x9B\x07F\x02\x02\x9B\x9C\x07" + - "\x12\x02\x02\x9C\x9D\x052\x1A\x02\x9D\x9E\x07F\x02\x02\x9E\x9F\x07\f\x02" + - "\x02\x9F\xA0\x05*\x16\x02\xA0\xA1\x07\x04\x02\x02\xA1\x1D\x03\x02\x02" + - "\x02\xA2\xA3\x07F\x02\x02\xA3\xA4\x07\f\x02\x02\xA4\xA5\x05*\x16\x02\xA5" + - "\xA6\x07\x04\x02\x02\xA6\x1F\x03\x02\x02\x02\xA7\xA8\x07\x14\x02\x02\xA8" + - "\xA9\x07\x11\x02\x02\xA9\xAA\x07D\x02\x02\xAA\xAB\x07\b\x02\x02\xAB\xAC" + - "\x05*\x16\x02\xAC\xAD\x07\x13\x02\x02\xAD\xAE\x07\x04\x02\x02\xAE!\x03" + - "\x02\x02\x02\xAF\xB0\x07\x14\x02\x02\xB0\xB1\x07\x11\x02\x02\xB1\xB2\x05" + - "*\x16\x02\xB2\xB3\x07\x13\x02\x02\xB3\xB4\x07\x04\x02\x02\xB4#\x03\x02" + - "\x02\x02\xB5\xB6\x07\x15\x02\x02\xB6\xB7\x07\x11\x02\x02\xB7\xB8\x05*" + - "\x16\x02\xB8\xB9\x07\x13\x02\x02\xB9\xBC\x05\x16\f\x02\xBA\xBB\x07\x16" + - "\x02\x02\xBB\xBD\x05\x16\f\x02\xBC\xBA\x03\x02\x02\x02\xBC\xBD\x03\x02" + - "\x02\x02\xBD%\x03\x02\x02\x02\xBE\xBF\x07F\x02\x02\xBF\xC0\x05(\x15\x02" + - "\xC0\'\x03\x02\x02\x02\xC1\xCD\x07\x11\x02\x02\xC2\xC7\x05*\x16\x02\xC3" + - "\xC4\x07\x12\x02\x02\xC4\xC6\x05*\x16\x02\xC5\xC3\x03\x02\x02\x02\xC6" + - "\xC9\x03\x02\x02\x02\xC7\xC5\x03\x02\x02\x02\xC7\xC8\x03\x02\x02\x02\xC8" + - "\xCB\x03\x02\x02\x02\xC9\xC7\x03\x02\x02\x02\xCA\xCC\x07\x12\x02\x02\xCB" + - "\xCA\x03\x02\x02\x02\xCB\xCC\x03\x02\x02\x02\xCC\xCE\x03\x02\x02\x02\xCD" + - "\xC2\x03\x02\x02\x02\xCD\xCE\x03\x02\x02\x02\xCE\xCF\x03\x02\x02\x02\xCF" + - "\xD0\x07\x13\x02\x02\xD0)\x03\x02\x02\x02\xD1\xD2\b\x16\x01\x02\xD2\xD3" + - "\x07\x11\x02\x02\xD3\xD4\x05*\x16\x02\xD4\xD5\x07\x13\x02\x02\xD5\u0107" + - "\x03\x02\x02\x02\xD6\xD7\x052\x1A\x02\xD7\xD8\x07\x11\x02\x02\xD8\xDB" + - "\x05*\x16\x02\xD9\xDA\x07\x12\x02\x02\xDA\xDC\x05*\x16\x02\xDB\xD9\x03" + - "\x02\x02\x02\xDB\xDC\x03\x02\x02\x02\xDC\xDE\x03\x02\x02\x02\xDD\xDF\x07" + - "\x12\x02\x02\xDE\xDD\x03\x02\x02\x02\xDE\xDF\x03\x02\x02\x02\xDF\xE0\x03" + - "\x02\x02\x02\xE0\xE1\x07\x13\x02\x02\xE1\u0107\x03\x02\x02\x02\xE2\u0107" + - "\x05&\x14\x02\xE3\xE4\x07\x17\x02\x02\xE4\xE5\x07F\x02\x02\xE5\u0107\x05" + - "(\x15\x02\xE6\xE7\x07\x1A\x02\x02\xE7\xE8\x07\x18\x02\x02\xE8\xE9\x05" + - "*\x16\x02\xE9\xEA\x07\x19\x02\x02\xEA\xEB\t\x03\x02\x02\xEB\u0107\x03" + - "\x02\x02\x02\xEC\xED\x07 \x02\x02\xED\xEE\x07\x18\x02\x02\xEE\xEF\x05" + - "*\x16\x02\xEF\xF0\x07\x19\x02\x02\xF0\xF1\t\x04\x02\x02\xF1\u0107\x03" + - "\x02\x02\x02\xF2\xF3\t\x05\x02\x02\xF3\u0107\x05*\x16\x10\xF4\u0100\x07" + - "\x18\x02\x02\xF5\xFA\x05*\x16\x02\xF6\xF7\x07\x12\x02\x02\xF7\xF9\x05" + - "*\x16\x02\xF8\xF6\x03\x02\x02\x02\xF9\xFC\x03\x02\x02\x02\xFA\xF8\x03" + - "\x02\x02\x02\xFA\xFB\x03\x02\x02\x02\xFB\xFE\x03\x02\x02\x02\xFC\xFA\x03" + - "\x02\x02\x02\xFD\xFF\x07\x12\x02\x02\xFE\xFD\x03\x02\x02\x02\xFE\xFF\x03" + - "\x02\x02\x02\xFF\u0101\x03\x02\x02\x02\u0100\xF5\x03\x02\x02\x02\u0100" + - "\u0101\x03\x02\x02\x02\u0101\u0102\x03\x02\x02\x02\u0102\u0107\x07\x19" + - "\x02\x02\u0103\u0107\x07E\x02\x02\u0104\u0107\x07F\x02\x02\u0105\u0107" + - "\x05.\x18\x02\u0106\xD1\x03\x02\x02\x02\u0106\xD6\x03\x02\x02\x02\u0106" + - "\xE2\x03\x02\x02\x02\u0106\xE3\x03\x02\x02\x02\u0106\xE6\x03\x02\x02\x02" + - "\u0106\xEC\x03\x02\x02\x02\u0106\xF2\x03\x02\x02\x02\u0106\xF4\x03\x02" + - "\x02\x02\u0106\u0103\x03\x02\x02\x02\u0106\u0104\x03\x02\x02\x02\u0106" + - "\u0105\x03\x02\x02\x02\u0107\u0131\x03\x02\x02\x02\u0108\u0109\f\x0F\x02" + - "\x02\u0109\u010A\t\x06\x02\x02\u010A\u0130\x05*\x16\x10\u010B\u010C\f" + - "\x0E\x02\x02\u010C\u010D\t\x07\x02\x02\u010D\u0130\x05*\x16\x0F\u010E" + - "\u010F\f\r\x02\x02\u010F\u0110\t\b\x02\x02\u0110\u0130\x05*\x16\x0E\u0111" + - "\u0112\f\f\x02\x02\u0112\u0113\t\t\x02\x02\u0113\u0130\x05*\x16\r\u0114" + - "\u0115\f\v\x02\x02\u0115\u0116\x070\x02\x02\u0116\u0130\x05*\x16\f\u0117" + - "\u0118\f\n\x02\x02\u0118\u0119\x07\x06\x02\x02\u0119\u0130\x05*\x16\v" + - "\u011A\u011B\f\t\x02\x02\u011B\u011C\x071\x02\x02\u011C\u0130\x05*\x16" + - "\n\u011D\u011E\f\b\x02\x02\u011E\u011F\x072\x02\x02\u011F\u0130\x05*\x16" + - "\t\u0120\u0121\f\x07\x02\x02\u0121\u0122\x073\x02\x02\u0122\u0130\x05" + - "*\x16\b\u0123\u0124\f\x15\x02\x02\u0124\u0125\x07\x18\x02\x02\u0125\u0126" + - "\x07>\x02\x02\u0126\u0130\x07\x19\x02\x02\u0127\u0128\f\x12\x02\x02\u0128" + - "\u0130\t\n\x02\x02\u0129\u012A\f\x11\x02\x02\u012A\u012B\x07\'\x02\x02" + - "\u012B\u012C\x07\x11\x02\x02\u012C\u012D\x05*\x16\x02\u012D\u012E\x07" + - "\x13\x02\x02\u012E\u0130\x03\x02\x02\x02\u012F\u0108\x03\x02\x02\x02\u012F" + - "\u010B\x03\x02\x02\x02\u012F\u010E\x03\x02\x02\x02\u012F\u0111\x03\x02" + - "\x02\x02\u012F\u0114\x03\x02\x02\x02\u012F\u0117\x03\x02\x02\x02\u012F" + - "\u011A\x03\x02\x02\x02\u012F\u011D\x03\x02\x02\x02\u012F\u0120\x03\x02" + - "\x02\x02\u012F\u0123\x03\x02\x02\x02\u012F\u0127\x03\x02\x02\x02\u012F" + - "\u0129\x03\x02\x02\x02\u0130\u0133\x03\x02\x02\x02\u0131\u012F\x03\x02" + - "\x02\x02\u0131\u0132\x03\x02\x02\x02\u0132+\x03\x02\x02\x02\u0133\u0131" + - "\x03\x02\x02\x02\u0134\u0135\x074\x02\x02\u0135-\x03\x02\x02\x02\u0136" + - "\u013C\x07<\x02\x02\u0137\u013C\x050\x19\x02\u0138\u013C\x07A\x02\x02" + - "\u0139\u013C\x07B\x02\x02\u013A\u013C\x07C\x02\x02\u013B\u0136\x03\x02" + - "\x02\x02\u013B\u0137\x03\x02\x02\x02\u013B\u0138\x03\x02\x02\x02\u013B" + - "\u0139\x03\x02\x02\x02\u013B\u013A\x03\x02\x02\x02\u013C/\x03\x02\x02" + - "\x02\u013D\u013F\x07>\x02\x02\u013E\u0140\x07=\x02\x02\u013F\u013E\x03" + - "\x02\x02\x02\u013F\u0140\x03\x02\x02\x02\u01401\x03\x02\x02\x02\u0141" + - "\u0142\t\v\x02\x02\u01423\x03\x02\x02\x02\x1C7FIVbmqs~\x83\x8B\x91\xBC" + - "\xC7\xCB\xCD\xDB\xDE\xFA\xFE\u0100\u0106\u012F\u0131\u013B\u013F"; - public static __ATN: ATN; + public static readonly _serializedATN: number[] = [4,1,71,322,2,0,7,0,2, + 1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2, + 10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17, + 7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7, + 24,1,0,5,0,52,8,0,10,0,12,0,55,9,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,2, + 1,2,1,3,1,3,3,3,69,8,3,1,4,3,4,72,8,4,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1, + 6,5,6,83,8,6,10,6,12,6,86,9,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,5,7,95,8,7,10, + 7,12,7,98,9,7,1,7,1,7,1,8,1,8,1,8,1,8,5,8,106,8,8,10,8,12,8,109,9,8,1,8, + 3,8,112,8,8,3,8,114,8,8,1,8,1,8,1,9,1,9,1,9,1,10,1,10,5,10,123,8,10,10, + 10,12,10,126,9,10,1,10,1,10,3,10,130,8,10,1,11,1,11,1,11,1,11,1,11,1,11, + 3,11,138,8,11,1,12,1,12,5,12,142,8,12,10,12,12,12,145,9,12,1,12,1,12,1, + 12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14, + 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1, + 16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,187,8,17,1,18,1,18,1,18, + 1,19,1,19,1,19,1,19,5,19,196,8,19,10,19,12,19,199,9,19,1,19,3,19,202,8, + 19,3,19,204,8,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,3,20,218,8,20,1,20,3,20,221,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,5,20,247,8,20,10,20,12,20,250,9,20,1,20,3,20,253,8,20,3,20, + 255,8,20,1,20,1,20,1,20,1,20,3,20,261,8,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,5,20,302,8,20,10,20,12,20,305,9,20,1,21,1,21,1,22,1, + 22,1,22,1,22,1,22,3,22,314,8,22,1,23,1,23,3,23,318,8,23,1,24,1,24,1,24, + 0,1,40,25,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, + 44,46,48,0,10,1,0,4,10,1,0,25,29,2,0,25,29,31,34,1,0,38,39,1,0,40,42,2, + 0,39,39,43,43,1,0,6,9,1,0,44,45,1,0,35,36,2,0,51,56,61,61,348,0,53,1,0, + 0,0,2,59,1,0,0,0,4,64,1,0,0,0,6,66,1,0,0,0,8,71,1,0,0,0,10,75,1,0,0,0,12, + 77,1,0,0,0,14,89,1,0,0,0,16,101,1,0,0,0,18,117,1,0,0,0,20,129,1,0,0,0,22, + 137,1,0,0,0,24,139,1,0,0,0,26,151,1,0,0,0,28,160,1,0,0,0,30,165,1,0,0,0, + 32,173,1,0,0,0,34,179,1,0,0,0,36,188,1,0,0,0,38,191,1,0,0,0,40,260,1,0, + 0,0,42,306,1,0,0,0,44,313,1,0,0,0,46,315,1,0,0,0,48,319,1,0,0,0,50,52,3, + 2,1,0,51,50,1,0,0,0,52,55,1,0,0,0,53,51,1,0,0,0,53,54,1,0,0,0,54,56,1,0, + 0,0,55,53,1,0,0,0,56,57,3,12,6,0,57,58,5,0,0,1,58,1,1,0,0,0,59,60,5,1,0, + 0,60,61,3,4,2,0,61,62,3,6,3,0,62,63,5,2,0,0,63,3,1,0,0,0,64,65,5,3,0,0, + 65,5,1,0,0,0,66,68,3,8,4,0,67,69,3,8,4,0,68,67,1,0,0,0,68,69,1,0,0,0,69, + 7,1,0,0,0,70,72,3,10,5,0,71,70,1,0,0,0,71,72,1,0,0,0,72,73,1,0,0,0,73,74, + 5,57,0,0,74,9,1,0,0,0,75,76,7,0,0,0,76,11,1,0,0,0,77,78,5,11,0,0,78,79, + 5,68,0,0,79,80,3,16,8,0,80,84,5,12,0,0,81,83,3,14,7,0,82,81,1,0,0,0,83, + 86,1,0,0,0,84,82,1,0,0,0,84,85,1,0,0,0,85,87,1,0,0,0,86,84,1,0,0,0,87,88, + 5,13,0,0,88,13,1,0,0,0,89,90,5,14,0,0,90,91,5,68,0,0,91,92,3,16,8,0,92, + 96,5,12,0,0,93,95,3,22,11,0,94,93,1,0,0,0,95,98,1,0,0,0,96,94,1,0,0,0,96, + 97,1,0,0,0,97,99,1,0,0,0,98,96,1,0,0,0,99,100,5,13,0,0,100,15,1,0,0,0,101, + 113,5,15,0,0,102,107,3,18,9,0,103,104,5,16,0,0,104,106,3,18,9,0,105,103, + 1,0,0,0,106,109,1,0,0,0,107,105,1,0,0,0,107,108,1,0,0,0,108,111,1,0,0,0, + 109,107,1,0,0,0,110,112,5,16,0,0,111,110,1,0,0,0,111,112,1,0,0,0,112,114, + 1,0,0,0,113,102,1,0,0,0,113,114,1,0,0,0,114,115,1,0,0,0,115,116,5,17,0, + 0,116,17,1,0,0,0,117,118,3,48,24,0,118,119,5,68,0,0,119,19,1,0,0,0,120, + 124,5,12,0,0,121,123,3,22,11,0,122,121,1,0,0,0,123,126,1,0,0,0,124,122, + 1,0,0,0,124,125,1,0,0,0,125,127,1,0,0,0,126,124,1,0,0,0,127,130,5,13,0, + 0,128,130,3,22,11,0,129,120,1,0,0,0,129,128,1,0,0,0,130,21,1,0,0,0,131, + 138,3,24,12,0,132,138,3,26,13,0,133,138,3,28,14,0,134,138,3,30,15,0,135, + 138,3,32,16,0,136,138,3,34,17,0,137,131,1,0,0,0,137,132,1,0,0,0,137,133, + 1,0,0,0,137,134,1,0,0,0,137,135,1,0,0,0,137,136,1,0,0,0,138,23,1,0,0,0, + 139,143,3,48,24,0,140,142,3,42,21,0,141,140,1,0,0,0,142,145,1,0,0,0,143, + 141,1,0,0,0,143,144,1,0,0,0,144,146,1,0,0,0,145,143,1,0,0,0,146,147,5,68, + 0,0,147,148,5,10,0,0,148,149,3,40,20,0,149,150,5,2,0,0,150,25,1,0,0,0,151, + 152,3,48,24,0,152,153,5,68,0,0,153,154,5,16,0,0,154,155,3,48,24,0,155,156, + 5,68,0,0,156,157,5,10,0,0,157,158,3,40,20,0,158,159,5,2,0,0,159,27,1,0, + 0,0,160,161,5,68,0,0,161,162,5,10,0,0,162,163,3,40,20,0,163,164,5,2,0,0, + 164,29,1,0,0,0,165,166,5,18,0,0,166,167,5,15,0,0,167,168,5,66,0,0,168,169, + 5,6,0,0,169,170,3,40,20,0,170,171,5,17,0,0,171,172,5,2,0,0,172,31,1,0,0, + 0,173,174,5,18,0,0,174,175,5,15,0,0,175,176,3,40,20,0,176,177,5,17,0,0, + 177,178,5,2,0,0,178,33,1,0,0,0,179,180,5,19,0,0,180,181,5,15,0,0,181,182, + 3,40,20,0,182,183,5,17,0,0,183,186,3,20,10,0,184,185,5,20,0,0,185,187,3, + 20,10,0,186,184,1,0,0,0,186,187,1,0,0,0,187,35,1,0,0,0,188,189,5,68,0,0, + 189,190,3,38,19,0,190,37,1,0,0,0,191,203,5,15,0,0,192,197,3,40,20,0,193, + 194,5,16,0,0,194,196,3,40,20,0,195,193,1,0,0,0,196,199,1,0,0,0,197,195, + 1,0,0,0,197,198,1,0,0,0,198,201,1,0,0,0,199,197,1,0,0,0,200,202,5,16,0, + 0,201,200,1,0,0,0,201,202,1,0,0,0,202,204,1,0,0,0,203,192,1,0,0,0,203,204, + 1,0,0,0,204,205,1,0,0,0,205,206,5,17,0,0,206,39,1,0,0,0,207,208,6,20,-1, + 0,208,209,5,15,0,0,209,210,3,40,20,0,210,211,5,17,0,0,211,261,1,0,0,0,212, + 213,3,48,24,0,213,214,5,15,0,0,214,217,3,40,20,0,215,216,5,16,0,0,216,218, + 3,40,20,0,217,215,1,0,0,0,217,218,1,0,0,0,218,220,1,0,0,0,219,221,5,16, + 0,0,220,219,1,0,0,0,220,221,1,0,0,0,221,222,1,0,0,0,222,223,5,17,0,0,223, + 261,1,0,0,0,224,261,3,36,18,0,225,226,5,21,0,0,226,227,5,68,0,0,227,261, + 3,38,19,0,228,229,5,24,0,0,229,230,5,22,0,0,230,231,3,40,20,0,231,232,5, + 23,0,0,232,233,7,1,0,0,233,261,1,0,0,0,234,235,5,30,0,0,235,236,5,22,0, + 0,236,237,3,40,20,0,237,238,5,23,0,0,238,239,7,2,0,0,239,261,1,0,0,0,240, + 241,7,3,0,0,241,261,3,40,20,14,242,254,5,22,0,0,243,248,3,40,20,0,244,245, + 5,16,0,0,245,247,3,40,20,0,246,244,1,0,0,0,247,250,1,0,0,0,248,246,1,0, + 0,0,248,249,1,0,0,0,249,252,1,0,0,0,250,248,1,0,0,0,251,253,5,16,0,0,252, + 251,1,0,0,0,252,253,1,0,0,0,253,255,1,0,0,0,254,243,1,0,0,0,254,255,1,0, + 0,0,255,256,1,0,0,0,256,261,5,23,0,0,257,261,5,67,0,0,258,261,5,68,0,0, + 259,261,3,44,22,0,260,207,1,0,0,0,260,212,1,0,0,0,260,224,1,0,0,0,260,225, + 1,0,0,0,260,228,1,0,0,0,260,234,1,0,0,0,260,240,1,0,0,0,260,242,1,0,0,0, + 260,257,1,0,0,0,260,258,1,0,0,0,260,259,1,0,0,0,261,303,1,0,0,0,262,263, + 10,13,0,0,263,264,7,4,0,0,264,302,3,40,20,14,265,266,10,12,0,0,266,267, + 7,5,0,0,267,302,3,40,20,13,268,269,10,11,0,0,269,270,7,6,0,0,270,302,3, + 40,20,12,271,272,10,10,0,0,272,273,7,7,0,0,273,302,3,40,20,11,274,275,10, + 9,0,0,275,276,5,46,0,0,276,302,3,40,20,10,277,278,10,8,0,0,278,279,5,4, + 0,0,279,302,3,40,20,9,280,281,10,7,0,0,281,282,5,47,0,0,282,302,3,40,20, + 8,283,284,10,6,0,0,284,285,5,48,0,0,285,302,3,40,20,7,286,287,10,5,0,0, + 287,288,5,49,0,0,288,302,3,40,20,6,289,290,10,19,0,0,290,291,5,22,0,0,291, + 292,5,60,0,0,292,302,5,23,0,0,293,294,10,16,0,0,294,302,7,8,0,0,295,296, + 10,15,0,0,296,297,5,37,0,0,297,298,5,15,0,0,298,299,3,40,20,0,299,300,5, + 17,0,0,300,302,1,0,0,0,301,262,1,0,0,0,301,265,1,0,0,0,301,268,1,0,0,0, + 301,271,1,0,0,0,301,274,1,0,0,0,301,277,1,0,0,0,301,280,1,0,0,0,301,283, + 1,0,0,0,301,286,1,0,0,0,301,289,1,0,0,0,301,293,1,0,0,0,301,295,1,0,0,0, + 302,305,1,0,0,0,303,301,1,0,0,0,303,304,1,0,0,0,304,41,1,0,0,0,305,303, + 1,0,0,0,306,307,5,50,0,0,307,43,1,0,0,0,308,314,5,58,0,0,309,314,3,46,23, + 0,310,314,5,63,0,0,311,314,5,64,0,0,312,314,5,65,0,0,313,308,1,0,0,0,313, + 309,1,0,0,0,313,310,1,0,0,0,313,311,1,0,0,0,313,312,1,0,0,0,314,45,1,0, + 0,0,315,317,5,60,0,0,316,318,5,59,0,0,317,316,1,0,0,0,317,318,1,0,0,0,318, + 47,1,0,0,0,319,320,7,9,0,0,320,49,1,0,0,0,26,53,68,71,84,96,107,111,113, + 124,129,137,143,186,197,201,203,217,220,248,252,254,260,301,303,313,317]; + + private static __ATN: ATN; public static get _ATN(): ATN { if (!CashScriptParser.__ATN) { - CashScriptParser.__ATN = new ATNDeserializer().deserialize(Utils.toCharArray(CashScriptParser._serializedATN)); + CashScriptParser.__ATN = new ATNDeserializer().deserialize(CashScriptParser._serializedATN); } return CashScriptParser.__ATN; } + + static DecisionsToDFA = CashScriptParser._ATN.decisionToState.map( (ds: DecisionState, index: number) => new DFA(ds, index) ); + } export class SourceFileContext extends ParserRuleContext { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public contractDefinition(): ContractDefinitionContext { - return this.getRuleContext(0, ContractDefinitionContext); - } - public EOF(): TerminalNode { return this.getToken(CashScriptParser.EOF, 0); } - public pragmaDirective(): PragmaDirectiveContext[]; - public pragmaDirective(i: number): PragmaDirectiveContext; - public pragmaDirective(i?: number): PragmaDirectiveContext | PragmaDirectiveContext[] { - if (i === undefined) { - return this.getRuleContexts(PragmaDirectiveContext); - } else { - return this.getRuleContext(i, PragmaDirectiveContext); - } + return this.getTypedRuleContext(ContractDefinitionContext, 0) as ContractDefinitionContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public EOF(): TerminalNode { + return this.getToken(CashScriptParser.EOF, 0); + } + public pragmaDirective_list(): PragmaDirectiveContext[] { + return this.getTypedRuleContexts(PragmaDirectiveContext) as PragmaDirectiveContext[]; + } + public pragmaDirective(i: number): PragmaDirectiveContext { + return this.getTypedRuleContext(PragmaDirectiveContext, i) as PragmaDirectiveContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_sourceFile; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_sourceFile; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitSourceFile) { @@ -1990,18 +1914,20 @@ export class SourceFileContext extends ParserRuleContext { export class PragmaDirectiveContext extends ParserRuleContext { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public pragmaName(): PragmaNameContext { - return this.getRuleContext(0, PragmaNameContext); + return this.getTypedRuleContext(PragmaNameContext, 0) as PragmaNameContext; } public pragmaValue(): PragmaValueContext { - return this.getRuleContext(0, PragmaValueContext); + return this.getTypedRuleContext(PragmaValueContext, 0) as PragmaValueContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public get ruleIndex(): number { + return CashScriptParser.RULE_pragmaDirective; } // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_pragmaDirective; } - // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitPragmaDirective) { return visitor.visitPragmaDirective(this); @@ -2013,11 +1939,13 @@ export class PragmaDirectiveContext extends ParserRuleContext { export class PragmaNameContext extends ParserRuleContext { - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_pragmaName; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_pragmaName; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitPragmaName) { @@ -2030,20 +1958,19 @@ export class PragmaNameContext extends ParserRuleContext { export class PragmaValueContext extends ParserRuleContext { - public versionConstraint(): VersionConstraintContext[]; - public versionConstraint(i: number): VersionConstraintContext; - public versionConstraint(i?: number): VersionConstraintContext | VersionConstraintContext[] { - if (i === undefined) { - return this.getRuleContexts(VersionConstraintContext); - } else { - return this.getRuleContext(i, VersionConstraintContext); - } - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public versionConstraint_list(): VersionConstraintContext[] { + return this.getTypedRuleContexts(VersionConstraintContext) as VersionConstraintContext[]; + } + public versionConstraint(i: number): VersionConstraintContext { + return this.getTypedRuleContext(VersionConstraintContext, i) as VersionConstraintContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_pragmaValue; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_pragmaValue; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitPragmaValue) { @@ -2056,15 +1983,19 @@ export class PragmaValueContext extends ParserRuleContext { export class VersionConstraintContext extends ParserRuleContext { - public VersionLiteral(): TerminalNode { return this.getToken(CashScriptParser.VersionLiteral, 0); } - public versionOperator(): VersionOperatorContext | undefined { - return this.tryGetRuleContext(0, VersionOperatorContext); - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public VersionLiteral(): TerminalNode { + return this.getToken(CashScriptParser.VersionLiteral, 0); + } + public versionOperator(): VersionOperatorContext { + return this.getTypedRuleContext(VersionOperatorContext, 0) as VersionOperatorContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_versionConstraint; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_versionConstraint; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitVersionConstraint) { @@ -2077,11 +2008,13 @@ export class VersionConstraintContext extends ParserRuleContext { export class VersionOperatorContext extends ParserRuleContext { - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_versionOperator; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_versionOperator; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitVersionOperator) { @@ -2094,24 +2027,25 @@ export class VersionOperatorContext extends ParserRuleContext { export class ContractDefinitionContext extends ParserRuleContext { - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } public parameterList(): ParameterListContext { - return this.getRuleContext(0, ParameterListContext); + return this.getTypedRuleContext(ParameterListContext, 0) as ParameterListContext; } - public functionDefinition(): FunctionDefinitionContext[]; - public functionDefinition(i: number): FunctionDefinitionContext; - public functionDefinition(i?: number): FunctionDefinitionContext | FunctionDefinitionContext[] { - if (i === undefined) { - return this.getRuleContexts(FunctionDefinitionContext); - } else { - return this.getRuleContext(i, FunctionDefinitionContext); - } + public functionDefinition_list(): FunctionDefinitionContext[] { + return this.getTypedRuleContexts(FunctionDefinitionContext) as FunctionDefinitionContext[]; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public functionDefinition(i: number): FunctionDefinitionContext { + return this.getTypedRuleContext(FunctionDefinitionContext, i) as FunctionDefinitionContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_contractDefinition; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_contractDefinition; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitContractDefinition) { @@ -2124,24 +2058,25 @@ export class ContractDefinitionContext extends ParserRuleContext { export class FunctionDefinitionContext extends ParserRuleContext { - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } public parameterList(): ParameterListContext { - return this.getRuleContext(0, ParameterListContext); + return this.getTypedRuleContext(ParameterListContext, 0) as ParameterListContext; } - public statement(): StatementContext[]; - public statement(i: number): StatementContext; - public statement(i?: number): StatementContext | StatementContext[] { - if (i === undefined) { - return this.getRuleContexts(StatementContext); - } else { - return this.getRuleContext(i, StatementContext); - } + public statement_list(): StatementContext[] { + return this.getTypedRuleContexts(StatementContext) as StatementContext[]; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public statement(i: number): StatementContext { + return this.getTypedRuleContext(StatementContext, i) as StatementContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_functionDefinition; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_functionDefinition; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitFunctionDefinition) { @@ -2154,20 +2089,19 @@ export class FunctionDefinitionContext extends ParserRuleContext { export class ParameterListContext extends ParserRuleContext { - public parameter(): ParameterContext[]; - public parameter(i: number): ParameterContext; - public parameter(i?: number): ParameterContext | ParameterContext[] { - if (i === undefined) { - return this.getRuleContexts(ParameterContext); - } else { - return this.getRuleContext(i, ParameterContext); - } - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public parameter_list(): ParameterContext[] { + return this.getTypedRuleContexts(ParameterContext) as ParameterContext[]; + } + public parameter(i: number): ParameterContext { + return this.getTypedRuleContext(ParameterContext, i) as ParameterContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_parameterList; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_parameterList; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitParameterList) { @@ -2180,15 +2114,19 @@ export class ParameterListContext extends ParserRuleContext { export class ParameterContext extends ParserRuleContext { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public typeName(): TypeNameContext { - return this.getRuleContext(0, TypeNameContext); + return this.getTypedRuleContext(TypeNameContext, 0) as TypeNameContext; } - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } + public get ruleIndex(): number { + return CashScriptParser.RULE_parameter; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_parameter; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitParameter) { @@ -2201,20 +2139,19 @@ export class ParameterContext extends ParserRuleContext { export class BlockContext extends ParserRuleContext { - public statement(): StatementContext[]; - public statement(i: number): StatementContext; - public statement(i?: number): StatementContext | StatementContext[] { - if (i === undefined) { - return this.getRuleContexts(StatementContext); - } else { - return this.getRuleContext(i, StatementContext); - } - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public statement_list(): StatementContext[] { + return this.getTypedRuleContexts(StatementContext) as StatementContext[]; + } + public statement(i: number): StatementContext { + return this.getTypedRuleContext(StatementContext, i) as StatementContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_block; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_block; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitBlock) { @@ -2227,29 +2164,31 @@ export class BlockContext extends ParserRuleContext { export class StatementContext extends ParserRuleContext { - public variableDefinition(): VariableDefinitionContext | undefined { - return this.tryGetRuleContext(0, VariableDefinitionContext); + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; } - public tupleAssignment(): TupleAssignmentContext | undefined { - return this.tryGetRuleContext(0, TupleAssignmentContext); + public variableDefinition(): VariableDefinitionContext { + return this.getTypedRuleContext(VariableDefinitionContext, 0) as VariableDefinitionContext; } - public assignStatement(): AssignStatementContext | undefined { - return this.tryGetRuleContext(0, AssignStatementContext); + public tupleAssignment(): TupleAssignmentContext { + return this.getTypedRuleContext(TupleAssignmentContext, 0) as TupleAssignmentContext; } - public timeOpStatement(): TimeOpStatementContext | undefined { - return this.tryGetRuleContext(0, TimeOpStatementContext); + public assignStatement(): AssignStatementContext { + return this.getTypedRuleContext(AssignStatementContext, 0) as AssignStatementContext; } - public requireStatement(): RequireStatementContext | undefined { - return this.tryGetRuleContext(0, RequireStatementContext); + public timeOpStatement(): TimeOpStatementContext { + return this.getTypedRuleContext(TimeOpStatementContext, 0) as TimeOpStatementContext; } - public ifStatement(): IfStatementContext | undefined { - return this.tryGetRuleContext(0, IfStatementContext); + public requireStatement(): RequireStatementContext { + return this.getTypedRuleContext(RequireStatementContext, 0) as RequireStatementContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public ifStatement(): IfStatementContext { + return this.getTypedRuleContext(IfStatementContext, 0) as IfStatementContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_statement; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_statement; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitStatement) { @@ -2262,27 +2201,28 @@ export class StatementContext extends ParserRuleContext { export class VariableDefinitionContext extends ParserRuleContext { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public typeName(): TypeNameContext { - return this.getRuleContext(0, TypeNameContext); + return this.getTypedRuleContext(TypeNameContext, 0) as TypeNameContext; + } + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); } - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - public modifier(): ModifierContext[]; - public modifier(i: number): ModifierContext; - public modifier(i?: number): ModifierContext | ModifierContext[] { - if (i === undefined) { - return this.getRuleContexts(ModifierContext); - } else { - return this.getRuleContext(i, ModifierContext); - } + public modifier_list(): ModifierContext[] { + return this.getTypedRuleContexts(ModifierContext) as ModifierContext[]; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public modifier(i: number): ModifierContext { + return this.getTypedRuleContext(ModifierContext, i) as ModifierContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_variableDefinition; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_variableDefinition; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitVariableDefinition) { @@ -2295,33 +2235,29 @@ export class VariableDefinitionContext extends ParserRuleContext { export class TupleAssignmentContext extends ParserRuleContext { - public typeName(): TypeNameContext[]; - public typeName(i: number): TypeNameContext; - public typeName(i?: number): TypeNameContext | TypeNameContext[] { - if (i === undefined) { - return this.getRuleContexts(TypeNameContext); - } else { - return this.getRuleContext(i, TypeNameContext); - } + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; } - public Identifier(): TerminalNode[]; - public Identifier(i: number): TerminalNode; - public Identifier(i?: number): TerminalNode | TerminalNode[] { - if (i === undefined) { - return this.getTokens(CashScriptParser.Identifier); - } else { - return this.getToken(CashScriptParser.Identifier, i); - } + public typeName_list(): TypeNameContext[] { + return this.getTypedRuleContexts(TypeNameContext) as TypeNameContext[]; + } + public typeName(i: number): TypeNameContext { + return this.getTypedRuleContext(TypeNameContext, i) as TypeNameContext; + } + public Identifier_list(): TerminalNode[] { + return this.getTokens(CashScriptParser.Identifier); + } + public Identifier(i: number): TerminalNode { + return this.getToken(CashScriptParser.Identifier, i); } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public get ruleIndex(): number { + return CashScriptParser.RULE_tupleAssignment; } // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_tupleAssignment; } - // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitTupleAssignment) { return visitor.visitTupleAssignment(this); @@ -2333,16 +2269,20 @@ export class TupleAssignmentContext extends ParserRuleContext { export class AssignStatementContext extends ParserRuleContext { - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public get ruleIndex(): number { + return CashScriptParser.RULE_assignStatement; } // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_assignStatement; } - // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitAssignStatement) { return visitor.visitAssignStatement(this); @@ -2354,16 +2294,20 @@ export class AssignStatementContext extends ParserRuleContext { export class TimeOpStatementContext extends ParserRuleContext { - public TxVar(): TerminalNode { return this.getToken(CashScriptParser.TxVar, 0); } + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public TxVar(): TerminalNode { + return this.getToken(CashScriptParser.TxVar, 0); + } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public get ruleIndex(): number { + return CashScriptParser.RULE_timeOpStatement; } // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_timeOpStatement; } - // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitTimeOpStatement) { return visitor.visitTimeOpStatement(this); @@ -2375,15 +2319,17 @@ export class TimeOpStatementContext extends ParserRuleContext { export class RequireStatementContext extends ParserRuleContext { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public get ruleIndex(): number { + return CashScriptParser.RULE_requireStatement; } // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_requireStatement; } - // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitRequireStatement) { return visitor.visitRequireStatement(this); @@ -2397,23 +2343,22 @@ export class RequireStatementContext extends ParserRuleContext { export class IfStatementContext extends ParserRuleContext { public _ifBlock!: BlockContext; public _elseBlock!: BlockContext; + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - public block(): BlockContext[]; - public block(i: number): BlockContext; - public block(i?: number): BlockContext | BlockContext[] { - if (i === undefined) { - return this.getRuleContexts(BlockContext); - } else { - return this.getRuleContext(i, BlockContext); - } + public block_list(): BlockContext[] { + return this.getTypedRuleContexts(BlockContext) as BlockContext[]; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public block(i: number): BlockContext { + return this.getTypedRuleContext(BlockContext, i) as BlockContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_ifStatement; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_ifStatement; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitIfStatement) { @@ -2426,16 +2371,20 @@ export class IfStatementContext extends ParserRuleContext { export class FunctionCallContext extends ParserRuleContext { - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } public expressionList(): ExpressionListContext { - return this.getRuleContext(0, ExpressionListContext); + return this.getTypedRuleContext(ExpressionListContext, 0) as ExpressionListContext; } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { - super(parent, invokingState); + public get ruleIndex(): number { + return CashScriptParser.RULE_functionCall; } // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_functionCall; } - // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitFunctionCall) { return visitor.visitFunctionCall(this); @@ -2447,20 +2396,19 @@ export class FunctionCallContext extends ParserRuleContext { export class ExpressionListContext extends ParserRuleContext { - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } - } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_expressionList; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_expressionList; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitExpressionList) { @@ -2473,205 +2421,198 @@ export class ExpressionListContext extends ParserRuleContext { export class ExpressionContext extends ParserRuleContext { - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_expression; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_expression; } public copyFrom(ctx: ExpressionContext): void { super.copyFrom(ctx); } } -export class ParenthesisedContext extends ExpressionContext { - public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); +export class CastContext extends ExpressionContext { + public _castable!: ExpressionContext; + public _size!: ExpressionContext; + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public typeName(): TypeNameContext { + return this.getTypedRuleContext(TypeNameContext, 0) as TypeNameContext; + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitParenthesised) { - return visitor.visitParenthesised(this); + if (visitor.visitCast) { + return visitor.visitCast(this); } else { return visitor.visitChildren(this); } } } -export class CastContext extends ExpressionContext { - public _castable!: ExpressionContext; - public _size!: ExpressionContext; - public typeName(): TypeNameContext { - return this.getRuleContext(0, TypeNameContext); - } - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class UnaryIntrospectionOpContext extends ExpressionContext { + public _scope!: Token; + public _op!: Token; + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public expression(): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitCast) { - return visitor.visitCast(this); + if (visitor.visitUnaryIntrospectionOp) { + return visitor.visitUnaryIntrospectionOp(this); } else { return visitor.visitChildren(this); } } } -export class FunctionCallExpressionContext extends ExpressionContext { - public functionCall(): FunctionCallContext { - return this.getRuleContext(0, FunctionCallContext); +export class ArrayContext extends ExpressionContext { + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitFunctionCallExpression) { - return visitor.visitFunctionCallExpression(this); + if (visitor.visitArray) { + return visitor.visitArray(this); } else { return visitor.visitChildren(this); } } } -export class InstantiationContext extends ExpressionContext { - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } - public expressionList(): ExpressionListContext { - return this.getRuleContext(0, ExpressionListContext); +export class UnaryOpContext extends ExpressionContext { + public _op!: Token; + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public expression(): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitInstantiation) { - return visitor.visitInstantiation(this); + if (visitor.visitUnaryOp) { + return visitor.visitUnaryOp(this); } else { return visitor.visitChildren(this); } } } -export class TupleIndexOpContext extends ExpressionContext { - public _index!: Token; - public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); +export class IdentifierContext extends ExpressionContext { + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - public NumberLiteral(): TerminalNode { return this.getToken(CashScriptParser.NumberLiteral, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitTupleIndexOp) { - return visitor.visitTupleIndexOp(this); + if (visitor.visitIdentifier) { + return visitor.visitIdentifier(this); } else { return visitor.visitChildren(this); } } } -export class UnaryIntrospectionOpContext extends ExpressionContext { - public _scope!: Token; - public _op!: Token; - public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); +export class LiteralExpressionContext extends ExpressionContext { + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public literal(): LiteralContext { + return this.getTypedRuleContext(LiteralContext, 0) as LiteralContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitUnaryIntrospectionOp) { - return visitor.visitUnaryIntrospectionOp(this); + if (visitor.visitLiteralExpression) { + return visitor.visitLiteralExpression(this); } else { return visitor.visitChildren(this); } } } -export class UnaryOpContext extends ExpressionContext { - public _op!: Token; +export class TupleIndexOpContext extends ExpressionContext { + public _index!: Token; + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } public expression(): ExpressionContext { - return this.getRuleContext(0, ExpressionContext); + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public NumberLiteral(): TerminalNode { + return this.getToken(CashScriptParser.NumberLiteral, 0); } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitUnaryOp) { - return visitor.visitUnaryOp(this); + if (visitor.visitTupleIndexOp) { + return visitor.visitTupleIndexOp(this); } else { return visitor.visitChildren(this); } } } -export class BinaryOpContext extends ExpressionContext { - public _left!: ExpressionContext; - public _op!: Token; - public _right!: ExpressionContext; - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class InstantiationContext extends ExpressionContext { + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } + public expressionList(): ExpressionListContext { + return this.getTypedRuleContext(ExpressionListContext, 0) as ExpressionListContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitBinaryOp) { - return visitor.visitBinaryOp(this); + if (visitor.visitInstantiation) { + return visitor.visitInstantiation(this); } else { return visitor.visitChildren(this); } } } -export class ArrayContext extends ExpressionContext { - public expression(): ExpressionContext[]; - public expression(i: number): ExpressionContext; - public expression(i?: number): ExpressionContext | ExpressionContext[] { - if (i === undefined) { - return this.getRuleContexts(ExpressionContext); - } else { - return this.getRuleContext(i, ExpressionContext); - } +export class FunctionCallExpressionContext extends ExpressionContext { + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public functionCall(): FunctionCallContext { + return this.getTypedRuleContext(FunctionCallContext, 0) as FunctionCallContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitArray) { - return visitor.visitArray(this); + if (visitor.visitFunctionCallExpression) { + return visitor.visitFunctionCallExpression(this); } else { return visitor.visitChildren(this); } } } export class NullaryOpContext extends ExpressionContext { - public NullaryOp(): TerminalNode { return this.getToken(CashScriptParser.NullaryOp, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public NullaryOp(): TerminalNode { + return this.getToken(CashScriptParser.NullaryOp, 0); } // @Override public accept(visitor: CashScriptVisitor): Result { @@ -2682,33 +2623,41 @@ export class NullaryOpContext extends ExpressionContext { } } } -export class IdentifierContext extends ExpressionContext { - public Identifier(): TerminalNode { return this.getToken(CashScriptParser.Identifier, 0); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); +export class ParenthesisedContext extends ExpressionContext { + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); + } + public expression(): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitIdentifier) { - return visitor.visitIdentifier(this); + if (visitor.visitParenthesised) { + return visitor.visitParenthesised(this); } else { return visitor.visitChildren(this); } } } -export class LiteralExpressionContext extends ExpressionContext { - public literal(): LiteralContext { - return this.getRuleContext(0, LiteralContext); +export class BinaryOpContext extends ExpressionContext { + public _left!: ExpressionContext; + public _op!: Token; + public _right!: ExpressionContext; + constructor(parser: CashScriptParser, ctx: ExpressionContext) { + super(parser, ctx.parentCtx, ctx.invokingState); + super.copyFrom(ctx); } - constructor(ctx: ExpressionContext) { - super(ctx.parent, ctx.invokingState); - this.copyFrom(ctx); + public expression_list(): ExpressionContext[] { + return this.getTypedRuleContexts(ExpressionContext) as ExpressionContext[]; + } + public expression(i: number): ExpressionContext { + return this.getTypedRuleContext(ExpressionContext, i) as ExpressionContext; } // @Override public accept(visitor: CashScriptVisitor): Result { - if (visitor.visitLiteralExpression) { - return visitor.visitLiteralExpression(this); + if (visitor.visitBinaryOp) { + return visitor.visitBinaryOp(this); } else { return visitor.visitChildren(this); } @@ -2717,11 +2666,13 @@ export class LiteralExpressionContext extends ExpressionContext { export class ModifierContext extends ParserRuleContext { - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public get ruleIndex(): number { + return CashScriptParser.RULE_modifier; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_modifier; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitModifier) { @@ -2734,18 +2685,28 @@ export class ModifierContext extends ParserRuleContext { export class LiteralContext extends ParserRuleContext { - public BooleanLiteral(): TerminalNode | undefined { return this.tryGetToken(CashScriptParser.BooleanLiteral, 0); } - public numberLiteral(): NumberLiteralContext | undefined { - return this.tryGetRuleContext(0, NumberLiteralContext); - } - public StringLiteral(): TerminalNode | undefined { return this.tryGetToken(CashScriptParser.StringLiteral, 0); } - public DateLiteral(): TerminalNode | undefined { return this.tryGetToken(CashScriptParser.DateLiteral, 0); } - public HexLiteral(): TerminalNode | undefined { return this.tryGetToken(CashScriptParser.HexLiteral, 0); } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public BooleanLiteral(): TerminalNode { + return this.getToken(CashScriptParser.BooleanLiteral, 0); + } + public numberLiteral(): NumberLiteralContext { + return this.getTypedRuleContext(NumberLiteralContext, 0) as NumberLiteralContext; + } + public StringLiteral(): TerminalNode { + return this.getToken(CashScriptParser.StringLiteral, 0); + } + public DateLiteral(): TerminalNode { + return this.getToken(CashScriptParser.DateLiteral, 0); + } + public HexLiteral(): TerminalNode { + return this.getToken(CashScriptParser.HexLiteral, 0); + } + public get ruleIndex(): number { + return CashScriptParser.RULE_literal; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_literal; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitLiteral) { @@ -2758,13 +2719,19 @@ export class LiteralContext extends ParserRuleContext { export class NumberLiteralContext extends ParserRuleContext { - public NumberLiteral(): TerminalNode { return this.getToken(CashScriptParser.NumberLiteral, 0); } - public NumberUnit(): TerminalNode | undefined { return this.tryGetToken(CashScriptParser.NumberUnit, 0); } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public NumberLiteral(): TerminalNode { + return this.getToken(CashScriptParser.NumberLiteral, 0); + } + public NumberUnit(): TerminalNode { + return this.getToken(CashScriptParser.NumberUnit, 0); + } + public get ruleIndex(): number { + return CashScriptParser.RULE_numberLiteral; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_numberLiteral; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitNumberLiteral) { @@ -2777,12 +2744,16 @@ export class NumberLiteralContext extends ParserRuleContext { export class TypeNameContext extends ParserRuleContext { - public Bytes(): TerminalNode { return this.getToken(CashScriptParser.Bytes, 0); } - constructor(parent: ParserRuleContext | undefined, invokingState: number) { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); + this.parser = parser; + } + public Bytes(): TerminalNode { + return this.getToken(CashScriptParser.Bytes, 0); + } + public get ruleIndex(): number { + return CashScriptParser.RULE_typeName; } - // @Override - public get ruleIndex(): number { return CashScriptParser.RULE_typeName; } // @Override public accept(visitor: CashScriptVisitor): Result { if (visitor.visitTypeName) { @@ -2792,5 +2763,3 @@ export class TypeNameContext extends ParserRuleContext { } } } - - diff --git a/packages/cashc/src/grammar/CashScriptVisitor.ts b/packages/cashc/src/grammar/CashScriptVisitor.ts index d557ffef..f99a0bf0 100644 --- a/packages/cashc/src/grammar/CashScriptVisitor.ts +++ b/packages/cashc/src/grammar/CashScriptVisitor.ts @@ -1,45 +1,44 @@ -// Generated from src/grammar/CashScript.g4 by ANTLR 4.9.0-SNAPSHOT - - -import { ParseTreeVisitor } from "antlr4ts/tree/ParseTreeVisitor.js"; - -import { ParenthesisedContext } from "./CashScriptParser.js"; -import { CastContext } from "./CashScriptParser.js"; -import { FunctionCallExpressionContext } from "./CashScriptParser.js"; -import { InstantiationContext } from "./CashScriptParser.js"; -import { TupleIndexOpContext } from "./CashScriptParser.js"; -import { UnaryIntrospectionOpContext } from "./CashScriptParser.js"; -import { UnaryOpContext } from "./CashScriptParser.js"; -import { BinaryOpContext } from "./CashScriptParser.js"; -import { ArrayContext } from "./CashScriptParser.js"; -import { NullaryOpContext } from "./CashScriptParser.js"; -import { IdentifierContext } from "./CashScriptParser.js"; -import { LiteralExpressionContext } from "./CashScriptParser.js"; -import { SourceFileContext } from "./CashScriptParser.js"; -import { PragmaDirectiveContext } from "./CashScriptParser.js"; -import { PragmaNameContext } from "./CashScriptParser.js"; -import { PragmaValueContext } from "./CashScriptParser.js"; -import { VersionConstraintContext } from "./CashScriptParser.js"; -import { VersionOperatorContext } from "./CashScriptParser.js"; -import { ContractDefinitionContext } from "./CashScriptParser.js"; -import { FunctionDefinitionContext } from "./CashScriptParser.js"; -import { ParameterListContext } from "./CashScriptParser.js"; -import { ParameterContext } from "./CashScriptParser.js"; -import { BlockContext } from "./CashScriptParser.js"; -import { StatementContext } from "./CashScriptParser.js"; -import { VariableDefinitionContext } from "./CashScriptParser.js"; -import { TupleAssignmentContext } from "./CashScriptParser.js"; -import { AssignStatementContext } from "./CashScriptParser.js"; -import { TimeOpStatementContext } from "./CashScriptParser.js"; -import { RequireStatementContext } from "./CashScriptParser.js"; -import { IfStatementContext } from "./CashScriptParser.js"; -import { FunctionCallContext } from "./CashScriptParser.js"; -import { ExpressionListContext } from "./CashScriptParser.js"; -import { ExpressionContext } from "./CashScriptParser.js"; -import { ModifierContext } from "./CashScriptParser.js"; -import { LiteralContext } from "./CashScriptParser.js"; -import { NumberLiteralContext } from "./CashScriptParser.js"; -import { TypeNameContext } from "./CashScriptParser.js"; +// Generated from src/grammar/CashScript.g4 by ANTLR 4.13.1 + +import {ParseTreeVisitor} from 'antlr4'; + + +import { SourceFileContext } from "./CashScriptParser"; +import { PragmaDirectiveContext } from "./CashScriptParser"; +import { PragmaNameContext } from "./CashScriptParser"; +import { PragmaValueContext } from "./CashScriptParser"; +import { VersionConstraintContext } from "./CashScriptParser"; +import { VersionOperatorContext } from "./CashScriptParser"; +import { ContractDefinitionContext } from "./CashScriptParser"; +import { FunctionDefinitionContext } from "./CashScriptParser"; +import { ParameterListContext } from "./CashScriptParser"; +import { ParameterContext } from "./CashScriptParser"; +import { BlockContext } from "./CashScriptParser"; +import { StatementContext } from "./CashScriptParser"; +import { VariableDefinitionContext } from "./CashScriptParser"; +import { TupleAssignmentContext } from "./CashScriptParser"; +import { AssignStatementContext } from "./CashScriptParser"; +import { TimeOpStatementContext } from "./CashScriptParser"; +import { RequireStatementContext } from "./CashScriptParser"; +import { IfStatementContext } from "./CashScriptParser"; +import { FunctionCallContext } from "./CashScriptParser"; +import { ExpressionListContext } from "./CashScriptParser"; +import { CastContext } from "./CashScriptParser"; +import { UnaryIntrospectionOpContext } from "./CashScriptParser"; +import { ArrayContext } from "./CashScriptParser"; +import { UnaryOpContext } from "./CashScriptParser"; +import { IdentifierContext } from "./CashScriptParser"; +import { LiteralExpressionContext } from "./CashScriptParser"; +import { TupleIndexOpContext } from "./CashScriptParser"; +import { InstantiationContext } from "./CashScriptParser"; +import { FunctionCallExpressionContext } from "./CashScriptParser"; +import { NullaryOpContext } from "./CashScriptParser"; +import { ParenthesisedContext } from "./CashScriptParser"; +import { BinaryOpContext } from "./CashScriptParser"; +import { ModifierContext } from "./CashScriptParser"; +import { LiteralContext } from "./CashScriptParser"; +import { NumberLiteralContext } from "./CashScriptParser"; +import { TypeNameContext } from "./CashScriptParser"; /** @@ -49,271 +48,229 @@ import { TypeNameContext } from "./CashScriptParser.js"; * @param The return type of the visit operation. Use `void` for * operations with no return type. */ -export interface CashScriptVisitor extends ParseTreeVisitor { +export default class CashScriptVisitor extends ParseTreeVisitor { /** - * Visit a parse tree produced by the `Parenthesised` - * labeled alternative in `CashScriptParser.expression`. - * @param ctx the parse tree - * @return the visitor result - */ - visitParenthesised?: (ctx: ParenthesisedContext) => Result; - - /** - * Visit a parse tree produced by the `Cast` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.sourceFile`. * @param ctx the parse tree * @return the visitor result */ - visitCast?: (ctx: CastContext) => Result; - + visitSourceFile?: (ctx: SourceFileContext) => Result; /** - * Visit a parse tree produced by the `FunctionCallExpression` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.pragmaDirective`. * @param ctx the parse tree * @return the visitor result */ - visitFunctionCallExpression?: (ctx: FunctionCallExpressionContext) => Result; - + visitPragmaDirective?: (ctx: PragmaDirectiveContext) => Result; /** - * Visit a parse tree produced by the `Instantiation` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.pragmaName`. * @param ctx the parse tree * @return the visitor result */ - visitInstantiation?: (ctx: InstantiationContext) => Result; - + visitPragmaName?: (ctx: PragmaNameContext) => Result; /** - * Visit a parse tree produced by the `TupleIndexOp` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.pragmaValue`. * @param ctx the parse tree * @return the visitor result */ - visitTupleIndexOp?: (ctx: TupleIndexOpContext) => Result; - + visitPragmaValue?: (ctx: PragmaValueContext) => Result; /** - * Visit a parse tree produced by the `UnaryIntrospectionOp` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.versionConstraint`. * @param ctx the parse tree * @return the visitor result */ - visitUnaryIntrospectionOp?: (ctx: UnaryIntrospectionOpContext) => Result; - + visitVersionConstraint?: (ctx: VersionConstraintContext) => Result; /** - * Visit a parse tree produced by the `UnaryOp` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.versionOperator`. * @param ctx the parse tree * @return the visitor result */ - visitUnaryOp?: (ctx: UnaryOpContext) => Result; - + visitVersionOperator?: (ctx: VersionOperatorContext) => Result; /** - * Visit a parse tree produced by the `BinaryOp` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.contractDefinition`. * @param ctx the parse tree * @return the visitor result */ - visitBinaryOp?: (ctx: BinaryOpContext) => Result; - + visitContractDefinition?: (ctx: ContractDefinitionContext) => Result; /** - * Visit a parse tree produced by the `Array` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.functionDefinition`. * @param ctx the parse tree * @return the visitor result */ - visitArray?: (ctx: ArrayContext) => Result; - + visitFunctionDefinition?: (ctx: FunctionDefinitionContext) => Result; /** - * Visit a parse tree produced by the `NullaryOp` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.parameterList`. * @param ctx the parse tree * @return the visitor result */ - visitNullaryOp?: (ctx: NullaryOpContext) => Result; - + visitParameterList?: (ctx: ParameterListContext) => Result; /** - * Visit a parse tree produced by the `Identifier` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.parameter`. * @param ctx the parse tree * @return the visitor result */ - visitIdentifier?: (ctx: IdentifierContext) => Result; - + visitParameter?: (ctx: ParameterContext) => Result; /** - * Visit a parse tree produced by the `LiteralExpression` - * labeled alternative in `CashScriptParser.expression`. + * Visit a parse tree produced by `CashScriptParser.block`. * @param ctx the parse tree * @return the visitor result */ - visitLiteralExpression?: (ctx: LiteralExpressionContext) => Result; - + visitBlock?: (ctx: BlockContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.sourceFile`. + * Visit a parse tree produced by `CashScriptParser.statement`. * @param ctx the parse tree * @return the visitor result */ - visitSourceFile?: (ctx: SourceFileContext) => Result; - + visitStatement?: (ctx: StatementContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.pragmaDirective`. + * Visit a parse tree produced by `CashScriptParser.variableDefinition`. * @param ctx the parse tree * @return the visitor result */ - visitPragmaDirective?: (ctx: PragmaDirectiveContext) => Result; - + visitVariableDefinition?: (ctx: VariableDefinitionContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.pragmaName`. + * Visit a parse tree produced by `CashScriptParser.tupleAssignment`. * @param ctx the parse tree * @return the visitor result */ - visitPragmaName?: (ctx: PragmaNameContext) => Result; - + visitTupleAssignment?: (ctx: TupleAssignmentContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.pragmaValue`. + * Visit a parse tree produced by `CashScriptParser.assignStatement`. * @param ctx the parse tree * @return the visitor result */ - visitPragmaValue?: (ctx: PragmaValueContext) => Result; - + visitAssignStatement?: (ctx: AssignStatementContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.versionConstraint`. + * Visit a parse tree produced by `CashScriptParser.timeOpStatement`. * @param ctx the parse tree * @return the visitor result */ - visitVersionConstraint?: (ctx: VersionConstraintContext) => Result; - + visitTimeOpStatement?: (ctx: TimeOpStatementContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.versionOperator`. + * Visit a parse tree produced by `CashScriptParser.requireStatement`. * @param ctx the parse tree * @return the visitor result */ - visitVersionOperator?: (ctx: VersionOperatorContext) => Result; - + visitRequireStatement?: (ctx: RequireStatementContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.contractDefinition`. + * Visit a parse tree produced by `CashScriptParser.ifStatement`. * @param ctx the parse tree * @return the visitor result */ - visitContractDefinition?: (ctx: ContractDefinitionContext) => Result; - + visitIfStatement?: (ctx: IfStatementContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.functionDefinition`. + * Visit a parse tree produced by `CashScriptParser.functionCall`. * @param ctx the parse tree * @return the visitor result */ - visitFunctionDefinition?: (ctx: FunctionDefinitionContext) => Result; - + visitFunctionCall?: (ctx: FunctionCallContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.parameterList`. + * Visit a parse tree produced by `CashScriptParser.expressionList`. * @param ctx the parse tree * @return the visitor result */ - visitParameterList?: (ctx: ParameterListContext) => Result; - + visitExpressionList?: (ctx: ExpressionListContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.parameter`. + * Visit a parse tree produced by the `Cast` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitParameter?: (ctx: ParameterContext) => Result; - + visitCast?: (ctx: CastContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.block`. + * Visit a parse tree produced by the `UnaryIntrospectionOp` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitBlock?: (ctx: BlockContext) => Result; - + visitUnaryIntrospectionOp?: (ctx: UnaryIntrospectionOpContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.statement`. + * Visit a parse tree produced by the `Array` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitStatement?: (ctx: StatementContext) => Result; - + visitArray?: (ctx: ArrayContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.variableDefinition`. + * Visit a parse tree produced by the `UnaryOp` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitVariableDefinition?: (ctx: VariableDefinitionContext) => Result; - + visitUnaryOp?: (ctx: UnaryOpContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.tupleAssignment`. + * Visit a parse tree produced by the `Identifier` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitTupleAssignment?: (ctx: TupleAssignmentContext) => Result; - + visitIdentifier?: (ctx: IdentifierContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.assignStatement`. + * Visit a parse tree produced by the `LiteralExpression` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitAssignStatement?: (ctx: AssignStatementContext) => Result; - + visitLiteralExpression?: (ctx: LiteralExpressionContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.timeOpStatement`. + * Visit a parse tree produced by the `TupleIndexOp` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitTimeOpStatement?: (ctx: TimeOpStatementContext) => Result; - + visitTupleIndexOp?: (ctx: TupleIndexOpContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.requireStatement`. + * Visit a parse tree produced by the `Instantiation` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitRequireStatement?: (ctx: RequireStatementContext) => Result; - + visitInstantiation?: (ctx: InstantiationContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.ifStatement`. + * Visit a parse tree produced by the `FunctionCallExpression` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitIfStatement?: (ctx: IfStatementContext) => Result; - + visitFunctionCallExpression?: (ctx: FunctionCallExpressionContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.functionCall`. + * Visit a parse tree produced by the `NullaryOp` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitFunctionCall?: (ctx: FunctionCallContext) => Result; - + visitNullaryOp?: (ctx: NullaryOpContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.expressionList`. + * Visit a parse tree produced by the `Parenthesised` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitExpressionList?: (ctx: ExpressionListContext) => Result; - + visitParenthesised?: (ctx: ParenthesisedContext) => Result; /** - * Visit a parse tree produced by `CashScriptParser.expression`. + * Visit a parse tree produced by the `BinaryOp` + * labeled alternative in `CashScriptParser.expression`. * @param ctx the parse tree * @return the visitor result */ - visitExpression?: (ctx: ExpressionContext) => Result; - + visitBinaryOp?: (ctx: BinaryOpContext) => Result; /** * Visit a parse tree produced by `CashScriptParser.modifier`. * @param ctx the parse tree * @return the visitor result */ visitModifier?: (ctx: ModifierContext) => Result; - /** * Visit a parse tree produced by `CashScriptParser.literal`. * @param ctx the parse tree * @return the visitor result */ visitLiteral?: (ctx: LiteralContext) => Result; - /** * Visit a parse tree produced by `CashScriptParser.numberLiteral`. * @param ctx the parse tree * @return the visitor result */ visitNumberLiteral?: (ctx: NumberLiteralContext) => Result; - /** * Visit a parse tree produced by `CashScriptParser.typeName`. * @param ctx the parse tree diff --git a/packages/cashc/test/ast/Location.test.ts b/packages/cashc/test/ast/Location.test.ts index 54c51769..9be8b326 100644 --- a/packages/cashc/test/ast/Location.test.ts +++ b/packages/cashc/test/ast/Location.test.ts @@ -12,4 +12,21 @@ describe('Location', () => { expect(f.location).toBeDefined(); expect((f.location!).text(code)).toEqual('function hello(sig s, pubkey pk) {\n require(checkSig(s, pk));\n }'); }); + + it('should set the correct location points', () => { + const code = fs.readFileSync(new URL('../valid-contract-files/simple_functions.cash', import.meta.url), { encoding: 'utf-8' }); + const ast = parseCode(code); + + const secondFunction = ast.contract.functions[1]; + + expect(secondFunction.location).toBeDefined(); + expect(secondFunction.location!.start).toEqual({ line: 6, column: 4 }); + expect(secondFunction.location!.end).toEqual({ line: 8, column: 5 }); + + const firstStatement = secondFunction.body.statements![0]; + + expect(firstStatement.location).toBeDefined(); + expect(firstStatement.location!.start).toEqual({ line: 7, column: 8 }); + expect(firstStatement.location!.end).toEqual({ line: 7, column: 29 }); + }); }); diff --git a/yarn.lock b/yarn.lock index 826b83c2..da4f1363 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2715,15 +2715,10 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -antlr4ts-cli@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts-cli/-/antlr4ts-cli-0.5.0-alpha.4.tgz#f3bfc37f10131e78d7b981c397a2aaa0450b67f6" - integrity sha512-lVPVBTA2CVHRYILSKilL6Jd4hAumhSZZWA7UbQNQrmaSSj7dPmmYaN4bOmZG79cOy0lS00i4LY68JZZjZMWVrw== - -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== +antlr4@^4.13.1-patch-1: + version "4.13.1-patch-1" + resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.13.1-patch-1.tgz#946176f863f890964a050c4f18c47fd6f7e57602" + integrity sha512-OjFLWWLzDMV9rdFhpvroCWR4ooktNg9/nvVYSA5z28wuVpU36QUNuioR1XLnQtcjVlf8npjyz593PxnU/f/Cow== any-promise@^1.0.0: version "1.3.0" From 01f9b9bb552c3c4d63b0c7c8f065a0e23b536ca6 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Wed, 10 Jan 2024 16:04:14 +0100 Subject: [PATCH 012/267] Bump version to 0.9.3 and update release notes --- examples/package.json | 6 +++--- packages/cashc/package.json | 4 ++-- packages/cashc/src/index.ts | 2 +- packages/cashscript/package.json | 4 ++-- packages/utils/package.json | 2 +- website/docs/releases/release-notes.md | 5 +++++ 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/examples/package.json b/examples/package.json index 2bb2f73b..41970230 100644 --- a/examples/package.json +++ b/examples/package.json @@ -1,7 +1,7 @@ { "name": "cashscript-examples", "private": true, - "version": "0.9.2", + "version": "0.9.3", "description": "Usage examples of the CashScript SDK", "main": "p2pkh.js", "type": "module", @@ -11,8 +11,8 @@ "@bitauth/libauth": "^2.0.0-alpha.8", "@types/node": "^12.7.8", "bip39": "^3.0.4", - "cashc": "^0.9.2", - "cashscript": "^0.9.2", + "cashc": "^0.9.3", + "cashscript": "^0.9.3", "typescript": "^4.9.5" } } diff --git a/packages/cashc/package.json b/packages/cashc/package.json index 207c5ed5..236524f4 100644 --- a/packages/cashc/package.json +++ b/packages/cashc/package.json @@ -1,6 +1,6 @@ { "name": "cashc", - "version": "0.9.2", + "version": "0.9.3", "description": "Compile Bitcoin Cash contracts to Bitcoin Cash Script or artifacts", "keywords": [ "bitcoin", @@ -50,7 +50,7 @@ }, "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", - "@cashscript/utils": "^0.9.2", + "@cashscript/utils": "^0.9.3", "antlr4": "^4.13.1-patch-1", "commander": "^7.1.0", "semver": "^7.3.4" diff --git a/packages/cashc/src/index.ts b/packages/cashc/src/index.ts index 57902d13..067593f4 100644 --- a/packages/cashc/src/index.ts +++ b/packages/cashc/src/index.ts @@ -2,4 +2,4 @@ export * from './Errors.js'; export * as utils from '@cashscript/utils'; export { compileFile, compileString } from './compiler.js'; -export const version = '0.9.2'; +export const version = '0.9.3'; diff --git a/packages/cashscript/package.json b/packages/cashscript/package.json index 3e5caa7a..be8cf64b 100644 --- a/packages/cashscript/package.json +++ b/packages/cashscript/package.json @@ -1,6 +1,6 @@ { "name": "cashscript", - "version": "0.9.2", + "version": "0.9.3", "description": "Easily write and interact with Bitcoin Cash contracts", "keywords": [ "bitcoin cash", @@ -44,7 +44,7 @@ }, "dependencies": { "@bitauth/libauth": "^2.0.0-alpha.8", - "@cashscript/utils": "^0.9.2", + "@cashscript/utils": "^0.9.3", "bip68": "^1.0.4", "bitcoin-rpc-promise-retry": "^1.3.0", "delay": "^5.0.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index 2eece0bf..144bf630 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@cashscript/utils", - "version": "0.9.2", + "version": "0.9.3", "description": "CashScript utilities and types", "keywords": [ "bitcoin cash", diff --git a/website/docs/releases/release-notes.md b/website/docs/releases/release-notes.md index 148ee32d..222fa905 100644 --- a/website/docs/releases/release-notes.md +++ b/website/docs/releases/release-notes.md @@ -2,6 +2,11 @@ title: Release Notes --- +## v0.9.3 + +#### cashc compiler +- :hammer_and_wrench: Migrate from antlr4ts to ANTLR's official TypeScript target to remove circular dependency issues. + ## v0.9.2 #### CashScript SDK From 112779dc39569d41b28c15828bd179dcf6b7232a Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Thu, 18 Jan 2024 10:28:25 +0100 Subject: [PATCH 013/267] Update libauth to latest stable release --- packages/cashc/package.json | 4 +-- packages/cashscript/package.json | 2 +- packages/cashscript/src/LibauthTemplate.ts | 40 +++++++++++----------- packages/cashscript/src/Transaction.ts | 4 +-- packages/cashscript/src/utils.ts | 4 +-- packages/utils/package.json | 2 +- yarn.lock | 5 +++ 7 files changed, 33 insertions(+), 28 deletions(-) diff --git a/packages/cashc/package.json b/packages/cashc/package.json index b0216a8c..046a9b38 100644 --- a/packages/cashc/package.json +++ b/packages/cashc/package.json @@ -49,11 +49,11 @@ "test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest" }, "dependencies": { - "@bitauth/libauth": "^2.0.0-alpha.8", + "@bitauth/libauth": "^2.0.0", "@cashscript/utils": "^0.10.0-next.2", "antlr4ts": "^0.5.0-alpha.4", "commander": "^7.1.0", - "semver": "^7.3.4" + "semver": "^7.5.4" }, "devDependencies": { "@jest/globals": "^29.4.1", diff --git a/packages/cashscript/package.json b/packages/cashscript/package.json index d85b4006..94587610 100644 --- a/packages/cashscript/package.json +++ b/packages/cashscript/package.json @@ -43,7 +43,7 @@ "test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest" }, "dependencies": { - "@bitauth/libauth": "^2.0.0-alpha.8", + "@bitauth/libauth": "^2.0.0", "@cashscript/utils": "^0.10.0-next.2", "bip68": "^1.0.4", "bitcoin-rpc-promise-retry": "^1.3.0", diff --git a/packages/cashscript/src/LibauthTemplate.ts b/packages/cashscript/src/LibauthTemplate.ts index cfc2018e..57bf0d3f 100644 --- a/packages/cashscript/src/LibauthTemplate.ts +++ b/packages/cashscript/src/LibauthTemplate.ts @@ -4,14 +4,14 @@ import { import { hash160, hexToBin, - AuthenticationTemplateScenarioTransactionOutput, - AuthenticationTemplateScenario, + WalletTemplateScenarioTransactionOutput, + WalletTemplateScenario, decodeTransaction, binToHex, - AuthenticationTemplate, - AuthenticationTemplateScenarioInput, + WalletTemplate, + WalletTemplateScenarioInput, TransactionBCH, - authenticationTemplateToCompilerConfiguration, + walletTemplateToCompilerConfiguration, createCompiler, createVirtualMachineBCHCHIPs, binToBase64, @@ -22,7 +22,7 @@ import { AuthenticationVirtualMachine, ResolvedTransactionCommon, AuthenticationErrorCommon, - AuthenticationTemplateScenarioOutput, + WalletTemplateScenarioOutput, } from '@bitauth/libauth'; import { deflate } from 'pako'; import { @@ -81,9 +81,9 @@ export const stringify = (any: any, spaces?: number): string => JSON.stringify( const zip = (a: any[], b: any[]): any[] => Array.from(Array(Math.max(b.length, a.length)), (_, i) => [a[i], b[i]]); -const createScenarioTransaction = (libauthTransaction: TransactionBCH, csTransaction: Transaction): AuthenticationTemplateScenario['transaction'] => { +const createScenarioTransaction = (libauthTransaction: TransactionBCH, csTransaction: Transaction): WalletTemplateScenario['transaction'] => { const contract = csTransaction.contract; - const result = ({} as AuthenticationTemplateScenario['transaction'])!; + const result = ({} as WalletTemplateScenario['transaction'])!; // only one 'slot' is allowed, otherwise {} must be used let inputSlotInserted = false; @@ -118,7 +118,7 @@ const createScenarioTransaction = (libauthTransaction: TransactionBCH, csTransac : input.outpointTransactionHash, sequenceNumber: input.sequenceNumber, unlockingBytecode, - } as AuthenticationTemplateScenarioInput; + } as WalletTemplateScenarioInput; }); result.locktime = libauthTransaction.locktime; @@ -166,20 +166,20 @@ const createScenarioTransaction = (libauthTransaction: TransactionBCH, csTransac : lockingBytecode, token: output.token, valueSatoshis: Number(output.valueSatoshis), - } as AuthenticationTemplateScenarioTransactionOutput; + } as WalletTemplateScenarioTransactionOutput; }, ); result.version = libauthTransaction.version; return result; }; -const createScenarioSourceOutputs = (csTransaction: Transaction): Array> => { +const createScenarioSourceOutputs = (csTransaction: Transaction): Array> => { // only one 'slot' is allowed, otherwise {} must be used let inputSlotInserted = false; return csTransaction.inputs.map( (csInput) => { const signable = isUtxoP2PKH(csInput); - let lockingBytecode = {} as AuthenticationTemplateScenarioOutput['lockingBytecode']; + let lockingBytecode = {} as WalletTemplateScenarioOutput['lockingBytecode']; if (signable) { lockingBytecode = { script: 'p2pkh_placeholder_lock', @@ -205,7 +205,7 @@ const createScenarioSourceOutputs = (csTransaction: Transaction): Array; + } as WalletTemplateScenarioOutput; if (csInput.token) { result.token = { @@ -232,7 +232,7 @@ export const buildTemplate = async ({ }: { transaction: Transaction; transactionHex?: string; -}): Promise => { +}): Promise => { const contract = transaction.contract; const txHex = transactionHex ?? await transaction.build(); @@ -278,7 +278,7 @@ export const buildTemplate = async ({ name: contract.artifact.contractName, supported: ['BCH_SPEC'], version: 0, - } as AuthenticationTemplate; + } as WalletTemplate; // declaration of template variables and their types template.entities = { @@ -464,7 +464,7 @@ export const buildTemplate = async ({ return template; }; -export const getBitauthUri = (template: AuthenticationTemplate): string => { +export const getBitauthUri = (template: WalletTemplate): string => { const base64toBase64Url = (base64: string): string => base64.replace(/\+/g, '-').replace(/\//g, '_'); const payload = base64toBase64Url( binToBase64(deflate(utf8ToBin(stringify(template)))), @@ -481,8 +481,8 @@ type Program = AuthenticationProgramCommon; type CreateProgramResult = { vm: VM, program: Program }; // internal util. instantiates the virtual machine and compiles the template into a program -const createProgram = (template: AuthenticationTemplate): CreateProgramResult => { - const configuration = authenticationTemplateToCompilerConfiguration(template); +const createProgram = (template: WalletTemplate): CreateProgramResult => { + const configuration = walletTemplateToCompilerConfiguration(template); const vm = createVirtualMachineBCHCHIPs(); const compiler = createCompiler(configuration); @@ -505,7 +505,7 @@ const createProgram = (template: AuthenticationTemplate): CreateProgramResult => }; // evaluates the fully defined template, throws upon error -export const evaluateTemplate = (template: AuthenticationTemplate): boolean => { +export const evaluateTemplate = (template: WalletTemplate): boolean => { const { vm, program } = createProgram(template); const verifyResult = vm.verify(program); @@ -520,7 +520,7 @@ export const evaluateTemplate = (template: AuthenticationTemplate): boolean => { export type DebugResult = AuthenticationProgramStateBCHCHIPs[]; // debugs the template, optionally logging the execution data -export const debugTemplate = (template: AuthenticationTemplate, artifact: Artifact): DebugResult => { +export const debugTemplate = (template: WalletTemplate, artifact: Artifact): DebugResult => { const { vm, program } = createProgram(template); const debugResult = vm.debug(program); diff --git a/packages/cashscript/src/Transaction.ts b/packages/cashscript/src/Transaction.ts index 62b69b61..8f4658d3 100644 --- a/packages/cashscript/src/Transaction.ts +++ b/packages/cashscript/src/Transaction.ts @@ -3,7 +3,7 @@ import { hexToBin, decodeTransaction, Transaction as LibauthTransaction, - AuthenticationTemplate, + WalletTemplate, } from '@bitauth/libauth'; import delay from 'delay'; import { @@ -174,7 +174,7 @@ export class Transaction { async send(raw?: true): Promise { const tx = await this.build(); - let template: AuthenticationTemplate | undefined; + let template: WalletTemplate | undefined; try { if (this.contract.provider instanceof MockNetworkProvider) { template = await buildTemplate({ diff --git a/packages/cashscript/src/utils.ts b/packages/cashscript/src/utils.ts index c9601ad3..cff75067 100644 --- a/packages/cashscript/src/utils.ts +++ b/packages/cashscript/src/utils.ts @@ -12,7 +12,7 @@ import { LockingBytecodeType, encodeTransactionOutput, isHex, - bigIntToCompactSize, + bigIntToCompactUint, AuthenticationErrorCommon, NonFungibleTokenCapability, bigIntToVmNumber, @@ -155,7 +155,7 @@ export function getTxSizeWithoutInputs(outputs: Output[]): number { let size = VERSION_SIZE + LOCKTIME_SIZE; size += outputs.reduce((acc, output) => acc + getOutputSize(output), 0); // Add tx-out count (accounting for a potential change output) - size += bigIntToCompactSize(BigInt(outputs.length + 1)).byteLength; + size += bigIntToCompactUint(BigInt(outputs.length + 1)).byteLength; return size; } diff --git a/packages/utils/package.json b/packages/utils/package.json index 30e6c48c..d2ff60f5 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -40,7 +40,7 @@ "test": "NODE_OPTIONS='--experimental-vm-modules --no-warnings' jest" }, "dependencies": { - "@bitauth/libauth": "^2.0.0-alpha.8", + "@bitauth/libauth": "^2.0.0", "hash.js": "^1.1.7" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 735c413f..6dd2c7f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -487,6 +487,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@bitauth/libauth@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bitauth/libauth/-/libauth-2.0.0.tgz#200a3c967bf1ab088a9ea17691ee354283aee0a6" + integrity sha512-wFnQtnJvz7S7jU7fQuBJzRQrVHk46DELd5s8D0F61bW567bKVVfMLbwNPCs12pzVckueQTlLwCS//I9skGI1zg== + "@bitauth/libauth@^2.0.0-alpha.8": version "2.0.0-alpha.8" resolved "https://registry.yarnpkg.com/@bitauth/libauth/-/libauth-2.0.0-alpha.8.tgz#352ade2075517f1548e05553e7bb1c5e1023d1fe" From 5160555ef4c16ed1ea7b50243945236e2f89eae3 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Thu, 18 Jan 2024 11:07:41 +0100 Subject: [PATCH 014/267] Fix broken postantlr script after ANTLR updates --- packages/cashc/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cashc/package.json b/packages/cashc/package.json index b7018aee..c7b449c3 100644 --- a/packages/cashc/package.json +++ b/packages/cashc/package.json @@ -35,7 +35,7 @@ }, "scripts": { "antlr": "antlr -Dlanguage=TypeScript -visitor -no-listener src/grammar/CashScript.g4", - "postantlr": "find src/grammar -type f -name '*.ts' | xargs sed -i '' 's|\\(import .* \".*/.*\\)\";|\\1\\.js\";|g'", + "postantlr": "find src/grammar -type f -name 'CashScriptVisitor.ts' | xargs sed -i '' 's|\\(import .* \".*/.*\\)\";|\\1\\.js\";|g'", "build": "yarn clean && yarn compile", "build:test": "yarn clean:test && yarn compile:test && cpy './test/**/*.cash' ./dist-test/test", "clean": "rm -rf ./dist", From a42badd523d772fe7212726991a6ef5adec1400b Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Thu, 18 Jan 2024 12:05:26 +0100 Subject: [PATCH 015/267] Refactor of the ConsoleStatementNode and ConsoleParameterNode --- packages/cashc/src/ast/AST.ts | 39 +- packages/cashc/src/ast/AstBuilder.ts | 17 +- packages/cashc/src/ast/AstTraversal.ts | 4 - packages/cashc/src/ast/AstVisitor.ts | 2 - packages/cashc/src/compiler.ts | 5 +- .../src/generation/GenerateTargetTraversal.ts | 40 +- packages/cashc/src/grammar/CashScript.g4 | 13 +- packages/cashc/src/grammar/CashScript.interp | 3 +- .../cashc/src/grammar/CashScriptParser.ts | 1023 +++++++++-------- .../cashc/src/grammar/CashScriptVisitor.ts | 7 + .../src/print/OutputSourceCodeTraversal.ts | 15 + .../src/semantic/SymbolTableTraversal.ts | 13 - packages/cashc/test/ast/fixtures.ts | 5 +- .../undefined_variable_in_console_log.cash | 5 + 14 files changed, 612 insertions(+), 579 deletions(-) create mode 100644 packages/cashc/test/compiler/UndefinedReferenceError/undefined_variable_in_console_log.cash diff --git a/packages/cashc/src/ast/AST.ts b/packages/cashc/src/ast/AST.ts index b12081dd..d6acd68a 100644 --- a/packages/cashc/src/ast/AST.ts +++ b/packages/cashc/src/ast/AST.ts @@ -4,6 +4,7 @@ import AstVisitor from './AstVisitor.js'; import { BinaryOperator, NullaryOperator, UnaryOperator } from './Operator.js'; import { Location } from './Location.js'; import { SymbolTable, Symbol } from './SymbolTable.js'; +import { binToHex } from '@bitauth/libauth'; export type Ast = SourceFileNode; @@ -97,8 +98,8 @@ export class VariableDefinitionNode extends StatementNode implements Named, Type export class TupleAssignmentNode extends StatementNode { constructor( - public var1: { name:string, type:Type }, - public var2: { name:string, type:Type }, + public var1: { name: string, type: Type }, + public var2: { name: string, type: Type }, public tuple: ExpressionNode, ) { super(); @@ -299,9 +300,15 @@ export class IdentifierNode extends ExpressionNode implements Named { } } -export abstract class LiteralNode extends ExpressionNode {} +export abstract class LiteralNode extends ExpressionNode { + public value: T; -export class BoolLiteralNode extends LiteralNode { + toString(): string { + return `${this.value}`; + } +} + +export class BoolLiteralNode extends LiteralNode { constructor( public value: boolean, ) { @@ -314,7 +321,7 @@ export class BoolLiteralNode extends LiteralNode { } } -export class IntLiteralNode extends LiteralNode { +export class IntLiteralNode extends LiteralNode { constructor( public value: bigint, ) { @@ -327,7 +334,7 @@ export class IntLiteralNode extends LiteralNode { } } -export class StringLiteralNode extends LiteralNode { +export class StringLiteralNode extends LiteralNode { constructor( public value: string, public quote: string, @@ -341,7 +348,7 @@ export class StringLiteralNode extends LiteralNode { } } -export class HexLiteralNode extends LiteralNode { +export class HexLiteralNode extends LiteralNode { constructor( public value: Uint8Array, ) { @@ -349,6 +356,10 @@ export class HexLiteralNode extends LiteralNode { this.type = new BytesType(value.byteLength); } + toString(): string { + return `0x${binToHex(this.value)}`; + } + accept(visitor: AstVisitor): T { return visitor.visitHexLiteral(this); } @@ -366,16 +377,4 @@ export class ConsoleStatementNode extends Node { } } -// TODO: Couldn't we just use existing nodes for this? e.g. IdentifierNode + StringLiteralNode etc. -export class ConsoleParameterNode extends Node { - constructor( - public message?: string, - public identifier?: string, - ) { - super(); - } - - accept(visitor: AstVisitor): T { - return visitor.visitConsoleParameter(this); - } -} +export type ConsoleParameterNode = LiteralNode | IdentifierNode; diff --git a/packages/cashc/src/ast/AstBuilder.ts b/packages/cashc/src/ast/AstBuilder.ts index 8a51b174..a3510267 100644 --- a/packages/cashc/src/ast/AstBuilder.ts +++ b/packages/cashc/src/ast/AstBuilder.ts @@ -65,6 +65,7 @@ import type { ConsoleStatementContext, ConsoleParameterContext, StatementContext, + RequireMessageContext, } from '../grammar/CashScriptParser.js'; import CashScriptVisitor from '../grammar/CashScriptVisitor.js'; import { Location } from './Location.js'; @@ -187,7 +188,7 @@ export default class AstBuilder visitTimeOpStatement(ctx: TimeOpStatementContext): TimeOpNode { const expression = this.visit(ctx.expression()); - const message = ctx.StringLiteral() ? this.createStringLiteral(ctx as any)?.value : undefined; + const message = ctx.requireMessage() ? this.createStringLiteral(ctx.requireMessage()).value : undefined; const timeOp = new TimeOpNode(ctx.TxVar().getText() as TimeOp, expression, message); timeOp.location = Location.fromCtx(ctx); @@ -196,7 +197,7 @@ export default class AstBuilder visitRequireStatement(ctx: RequireStatementContext): RequireNode { const expression = this.visit(ctx.expression()); - const message = ctx.StringLiteral() ? this.createStringLiteral(ctx as any)?.value : undefined; + const message = ctx.requireMessage() ? this.createStringLiteral(ctx.requireMessage()).value : undefined; const require = new RequireNode(expression, message); require.location = Location.fromCtx(ctx); return require; @@ -352,7 +353,7 @@ export default class AstBuilder return intLiteral; } - createStringLiteral(ctx: LiteralContext): StringLiteralNode { + createStringLiteral(ctx: LiteralContext | RequireMessageContext): StringLiteralNode { const rawString = ctx.StringLiteral().getText(); const stringValue = rawString.substring(1, rawString.length - 1); const quote = rawString.substring(0, 1); @@ -392,20 +393,14 @@ export default class AstBuilder const parameters = ctx.consoleParameterList() .consoleParameter_list() .map((p) => this.visit(p) as ConsoleParameterNode); + const node = new ConsoleStatementNode(parameters); node.location = Location.fromCtx(ctx); - return node; } visitConsoleParameter(ctx: ConsoleParameterContext): ConsoleParameterNode { - let message = (ctx.BooleanLiteral() ?? ctx.HexLiteral() ?? ctx.NumberLiteral() ?? ctx.StringLiteral())?.getText(); - if (message?.[0] === '"') { - message = message.slice(1, -1); - } - const identifier = ctx.Identifier()?.getText(); - - const node = new ConsoleParameterNode(message, identifier); + const node = ctx.literal() ? this.createLiteral(ctx.literal()) : new IdentifierNode(ctx.Identifier().getText()); node.location = Location.fromCtx(ctx); return node; } diff --git a/packages/cashc/src/ast/AstTraversal.ts b/packages/cashc/src/ast/AstTraversal.ts index 15c99829..81e3f340 100644 --- a/packages/cashc/src/ast/AstTraversal.ts +++ b/packages/cashc/src/ast/AstTraversal.ts @@ -157,8 +157,4 @@ export default class AstTraversal extends AstVisitor { node.parameters = this.visitList(node.parameters) as ConsoleParameterNode[]; return node; } - - visitConsoleParameter(node: ConsoleParameterNode): Node { - return node; - } } diff --git a/packages/cashc/src/ast/AstVisitor.ts b/packages/cashc/src/ast/AstVisitor.ts index e846d3c2..e154b5d1 100644 --- a/packages/cashc/src/ast/AstVisitor.ts +++ b/packages/cashc/src/ast/AstVisitor.ts @@ -25,7 +25,6 @@ import { TupleAssignmentNode, NullaryOpNode, ConsoleStatementNode, - ConsoleParameterNode, } from './AST.js'; export default abstract class AstVisitor { @@ -54,7 +53,6 @@ export default abstract class AstVisitor { abstract visitStringLiteral(node: StringLiteralNode): T; abstract visitHexLiteral(node: HexLiteralNode): T; abstract visitConsoleStatement(node: ConsoleStatementNode): T; - abstract visitConsoleParameter(node: ConsoleParameterNode): T; visit(node: Node): T { return node.accept(this); diff --git a/packages/cashc/src/compiler.ts b/packages/cashc/src/compiler.ts index 0701f577..8d8f2192 100644 --- a/packages/cashc/src/compiler.ts +++ b/packages/cashc/src/compiler.ts @@ -17,13 +17,12 @@ export function compileString(code: string): Artifact { let ast = parseCode(code); // Semantic analysis - const symbolTableTraversal = new SymbolTableTraversal(); - ast = ast.accept(symbolTableTraversal) as Ast; + ast = ast.accept(new SymbolTableTraversal()) as Ast; ast = ast.accept(new TypeCheckTraversal()) as Ast; ast = ast.accept(new EnsureFinalRequireTraversal()) as Ast; // Code generation - const traversal = new GenerateTargetTraversal(symbolTableTraversal.logSymbols); + const traversal = new GenerateTargetTraversal(); ast = ast.accept(traversal) as Ast; // Bytecode optimisation diff --git a/packages/cashc/src/generation/GenerateTargetTraversal.ts b/packages/cashc/src/generation/GenerateTargetTraversal.ts index 5bc1ea2f..3754ac2f 100644 --- a/packages/cashc/src/generation/GenerateTargetTraversal.ts +++ b/packages/cashc/src/generation/GenerateTargetTraversal.ts @@ -57,8 +57,6 @@ import { compileUnaryOp, } from './utils.js'; import { Location } from '../ast/Location.js'; -import { ParseError } from '../Errors.js'; -import { Symbol } from '../ast/SymbolTable.js'; export default class GenerateTargetTraversalWithLocation extends AstTraversal { private locationData: LocationData = []; // detailed location data needed for sourcemap creation @@ -72,10 +70,6 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { private currentFunction: FunctionDefinitionNode; private constructorParameterCount: number; - constructor(private logSymbols: Symbol[]) { - super(); - } - private emit(op: OpOrData | OpOrData[], location: LocationI, positionHint?: number): void { if (Array.isArray(op)) { op.forEach((element) => this.output.push(element as Op)); @@ -550,38 +544,24 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { visitConsoleStatement(node: ConsoleStatementNode): Node { // instruction pointer is the count of emitted opcodes + number of constructor data pushes const ip = this.output.length + this.constructorParameterCount; - const { line } = node.location!.start; + // TODO: refactor to use a map instead of array (also in the artifact and other places where console logs and + // require statements are used) // check if log entry exists for the instruction pointer, create if not let index = this.consoleLogs.findIndex((entry: LogEntry) => entry.ip === ip); if (index === -1) { - index = this.consoleLogs.push({ - ip, - line, - data: [], - }) - 1; + index = this.consoleLogs.push({ ip, line, data: [] }) - 1; } node.parameters.forEach((parameter: ConsoleParameterNode) => { - if (parameter.identifier) { - // we look for all symbols with identifier name - // then take the first which is declared in the nearest code block - const symbol = this.logSymbols - .filter((logSymbol) => logSymbol.name === parameter.identifier) - .sort((a, b) => b.definition?.location?.start.line! - a.definition?.location?.start.line!)[0]; - - if (!symbol) { - throw new ParseError(`Undefined reference to symbol ${parameter.identifier} at ${parameter.location?.start}`); - } - - const stackIndex = this.getStackIndex(parameter.identifier); - this.consoleLogs[index].data.push({ - stackIndex, - type: typeof symbol.type === 'string' ? symbol.type : symbol.toString(), - }); - } else if (parameter.message) { - this.consoleLogs[index].data.push(parameter.message); + if (parameter instanceof IdentifierNode) { + const symbol = parameter.definition!; + const stackIndex = this.getStackIndex(parameter.name); + const type = typeof symbol.type === 'string' ? symbol.type : symbol.toString(); + this.consoleLogs[index].data.push({ stackIndex, type }); + } else { + this.consoleLogs[index].data.push(parameter.toString()); } }); diff --git a/packages/cashc/src/grammar/CashScript.g4 b/packages/cashc/src/grammar/CashScript.g4 index a7890d08..bdbdbce6 100644 --- a/packages/cashc/src/grammar/CashScript.g4 +++ b/packages/cashc/src/grammar/CashScript.g4 @@ -68,11 +68,11 @@ assignStatement ; timeOpStatement - : 'require' '(' TxVar '>=' expression (',' StringLiteral)? ')' ';' + : 'require' '(' TxVar '>=' expression (',' requireMessage)? ')' ';' ; requireStatement - : 'require' '(' expression (',' StringLiteral)? ')' ';' + : 'require' '(' expression (',' requireMessage)? ')' ';' ; ifStatement @@ -83,12 +83,13 @@ consoleStatement : 'console.log' consoleParameterList ';' ; +requireMessage + : StringLiteral + ; + consoleParameter : Identifier - | StringLiteral - | NumberLiteral - | HexLiteral - | BooleanLiteral + | literal ; consoleParameterList diff --git a/packages/cashc/src/grammar/CashScript.interp b/packages/cashc/src/grammar/CashScript.interp index fd6dd5e4..97221ccb 100644 --- a/packages/cashc/src/grammar/CashScript.interp +++ b/packages/cashc/src/grammar/CashScript.interp @@ -168,6 +168,7 @@ timeOpStatement requireStatement ifStatement consoleStatement +requireMessage consoleParameter consoleParameterList functionCall @@ -180,4 +181,4 @@ typeName atn: -[4, 1, 72, 359, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 1, 0, 5, 0, 58, 8, 0, 10, 0, 12, 0, 61, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 75, 8, 3, 1, 4, 3, 4, 78, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 89, 8, 6, 10, 6, 12, 6, 92, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 101, 8, 7, 10, 7, 12, 7, 104, 9, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 112, 8, 8, 10, 8, 12, 8, 115, 9, 8, 1, 8, 3, 8, 118, 8, 8, 3, 8, 120, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 5, 10, 129, 8, 10, 10, 10, 12, 10, 132, 9, 10, 1, 10, 1, 10, 3, 10, 136, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 145, 8, 11, 1, 12, 1, 12, 5, 12, 149, 8, 12, 10, 12, 12, 12, 152, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 180, 8, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 190, 8, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 202, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 214, 8, 20, 10, 20, 12, 20, 217, 9, 20, 1, 20, 3, 20, 220, 8, 20, 3, 20, 222, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 233, 8, 22, 10, 22, 12, 22, 236, 9, 22, 1, 22, 3, 22, 239, 8, 22, 3, 22, 241, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 255, 8, 23, 1, 23, 3, 23, 258, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 284, 8, 23, 10, 23, 12, 23, 287, 9, 23, 1, 23, 3, 23, 290, 8, 23, 3, 23, 292, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 298, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 339, 8, 23, 10, 23, 12, 23, 342, 9, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 351, 8, 25, 1, 26, 1, 26, 3, 26, 355, 8, 26, 1, 27, 1, 27, 1, 27, 0, 1, 46, 28, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 0, 11, 1, 0, 4, 10, 5, 0, 59, 59, 61, 61, 64, 64, 66, 66, 69, 69, 1, 0, 26, 30, 2, 0, 26, 30, 32, 35, 1, 0, 39, 40, 1, 0, 41, 43, 2, 0, 40, 40, 44, 44, 1, 0, 6, 9, 1, 0, 45, 46, 1, 0, 36, 37, 2, 0, 52, 57, 62, 62, 388, 0, 59, 1, 0, 0, 0, 2, 65, 1, 0, 0, 0, 4, 70, 1, 0, 0, 0, 6, 72, 1, 0, 0, 0, 8, 77, 1, 0, 0, 0, 10, 81, 1, 0, 0, 0, 12, 83, 1, 0, 0, 0, 14, 95, 1, 0, 0, 0, 16, 107, 1, 0, 0, 0, 18, 123, 1, 0, 0, 0, 20, 135, 1, 0, 0, 0, 22, 144, 1, 0, 0, 0, 24, 146, 1, 0, 0, 0, 26, 158, 1, 0, 0, 0, 28, 167, 1, 0, 0, 0, 30, 172, 1, 0, 0, 0, 32, 184, 1, 0, 0, 0, 34, 194, 1, 0, 0, 0, 36, 203, 1, 0, 0, 0, 38, 207, 1, 0, 0, 0, 40, 209, 1, 0, 0, 0, 42, 225, 1, 0, 0, 0, 44, 228, 1, 0, 0, 0, 46, 297, 1, 0, 0, 0, 48, 343, 1, 0, 0, 0, 50, 350, 1, 0, 0, 0, 52, 352, 1, 0, 0, 0, 54, 356, 1, 0, 0, 0, 56, 58, 3, 2, 1, 0, 57, 56, 1, 0, 0, 0, 58, 61, 1, 0, 0, 0, 59, 57, 1, 0, 0, 0, 59, 60, 1, 0, 0, 0, 60, 62, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 62, 63, 3, 12, 6, 0, 63, 64, 5, 0, 0, 1, 64, 1, 1, 0, 0, 0, 65, 66, 5, 1, 0, 0, 66, 67, 3, 4, 2, 0, 67, 68, 3, 6, 3, 0, 68, 69, 5, 2, 0, 0, 69, 3, 1, 0, 0, 0, 70, 71, 5, 3, 0, 0, 71, 5, 1, 0, 0, 0, 72, 74, 3, 8, 4, 0, 73, 75, 3, 8, 4, 0, 74, 73, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 7, 1, 0, 0, 0, 76, 78, 3, 10, 5, 0, 77, 76, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 1, 0, 0, 0, 79, 80, 5, 58, 0, 0, 80, 9, 1, 0, 0, 0, 81, 82, 7, 0, 0, 0, 82, 11, 1, 0, 0, 0, 83, 84, 5, 11, 0, 0, 84, 85, 5, 69, 0, 0, 85, 86, 3, 16, 8, 0, 86, 90, 5, 12, 0, 0, 87, 89, 3, 14, 7, 0, 88, 87, 1, 0, 0, 0, 89, 92, 1, 0, 0, 0, 90, 88, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 93, 1, 0, 0, 0, 92, 90, 1, 0, 0, 0, 93, 94, 5, 13, 0, 0, 94, 13, 1, 0, 0, 0, 95, 96, 5, 14, 0, 0, 96, 97, 5, 69, 0, 0, 97, 98, 3, 16, 8, 0, 98, 102, 5, 12, 0, 0, 99, 101, 3, 22, 11, 0, 100, 99, 1, 0, 0, 0, 101, 104, 1, 0, 0, 0, 102, 100, 1, 0, 0, 0, 102, 103, 1, 0, 0, 0, 103, 105, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 105, 106, 5, 13, 0, 0, 106, 15, 1, 0, 0, 0, 107, 119, 5, 15, 0, 0, 108, 113, 3, 18, 9, 0, 109, 110, 5, 16, 0, 0, 110, 112, 3, 18, 9, 0, 111, 109, 1, 0, 0, 0, 112, 115, 1, 0, 0, 0, 113, 111, 1, 0, 0, 0, 113, 114, 1, 0, 0, 0, 114, 117, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 116, 118, 5, 16, 0, 0, 117, 116, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 120, 1, 0, 0, 0, 119, 108, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 121, 1, 0, 0, 0, 121, 122, 5, 17, 0, 0, 122, 17, 1, 0, 0, 0, 123, 124, 3, 54, 27, 0, 124, 125, 5, 69, 0, 0, 125, 19, 1, 0, 0, 0, 126, 130, 5, 12, 0, 0, 127, 129, 3, 22, 11, 0, 128, 127, 1, 0, 0, 0, 129, 132, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 130, 131, 1, 0, 0, 0, 131, 133, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 133, 136, 5, 13, 0, 0, 134, 136, 3, 22, 11, 0, 135, 126, 1, 0, 0, 0, 135, 134, 1, 0, 0, 0, 136, 21, 1, 0, 0, 0, 137, 145, 3, 24, 12, 0, 138, 145, 3, 26, 13, 0, 139, 145, 3, 28, 14, 0, 140, 145, 3, 30, 15, 0, 141, 145, 3, 32, 16, 0, 142, 145, 3, 34, 17, 0, 143, 145, 3, 36, 18, 0, 144, 137, 1, 0, 0, 0, 144, 138, 1, 0, 0, 0, 144, 139, 1, 0, 0, 0, 144, 140, 1, 0, 0, 0, 144, 141, 1, 0, 0, 0, 144, 142, 1, 0, 0, 0, 144, 143, 1, 0, 0, 0, 145, 23, 1, 0, 0, 0, 146, 150, 3, 54, 27, 0, 147, 149, 3, 48, 24, 0, 148, 147, 1, 0, 0, 0, 149, 152, 1, 0, 0, 0, 150, 148, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 153, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 153, 154, 5, 69, 0, 0, 154, 155, 5, 10, 0, 0, 155, 156, 3, 46, 23, 0, 156, 157, 5, 2, 0, 0, 157, 25, 1, 0, 0, 0, 158, 159, 3, 54, 27, 0, 159, 160, 5, 69, 0, 0, 160, 161, 5, 16, 0, 0, 161, 162, 3, 54, 27, 0, 162, 163, 5, 69, 0, 0, 163, 164, 5, 10, 0, 0, 164, 165, 3, 46, 23, 0, 165, 166, 5, 2, 0, 0, 166, 27, 1, 0, 0, 0, 167, 168, 5, 69, 0, 0, 168, 169, 5, 10, 0, 0, 169, 170, 3, 46, 23, 0, 170, 171, 5, 2, 0, 0, 171, 29, 1, 0, 0, 0, 172, 173, 5, 18, 0, 0, 173, 174, 5, 15, 0, 0, 174, 175, 5, 67, 0, 0, 175, 176, 5, 6, 0, 0, 176, 179, 3, 46, 23, 0, 177, 178, 5, 16, 0, 0, 178, 180, 5, 64, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 182, 5, 17, 0, 0, 182, 183, 5, 2, 0, 0, 183, 31, 1, 0, 0, 0, 184, 185, 5, 18, 0, 0, 185, 186, 5, 15, 0, 0, 186, 189, 3, 46, 23, 0, 187, 188, 5, 16, 0, 0, 188, 190, 5, 64, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 192, 5, 17, 0, 0, 192, 193, 5, 2, 0, 0, 193, 33, 1, 0, 0, 0, 194, 195, 5, 19, 0, 0, 195, 196, 5, 15, 0, 0, 196, 197, 3, 46, 23, 0, 197, 198, 5, 17, 0, 0, 198, 201, 3, 20, 10, 0, 199, 200, 5, 20, 0, 0, 200, 202, 3, 20, 10, 0, 201, 199, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 35, 1, 0, 0, 0, 203, 204, 5, 21, 0, 0, 204, 205, 3, 40, 20, 0, 205, 206, 5, 2, 0, 0, 206, 37, 1, 0, 0, 0, 207, 208, 7, 1, 0, 0, 208, 39, 1, 0, 0, 0, 209, 221, 5, 15, 0, 0, 210, 215, 3, 38, 19, 0, 211, 212, 5, 16, 0, 0, 212, 214, 3, 38, 19, 0, 213, 211, 1, 0, 0, 0, 214, 217, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 219, 1, 0, 0, 0, 217, 215, 1, 0, 0, 0, 218, 220, 5, 16, 0, 0, 219, 218, 1, 0, 0, 0, 219, 220, 1, 0, 0, 0, 220, 222, 1, 0, 0, 0, 221, 210, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 224, 5, 17, 0, 0, 224, 41, 1, 0, 0, 0, 225, 226, 5, 69, 0, 0, 226, 227, 3, 44, 22, 0, 227, 43, 1, 0, 0, 0, 228, 240, 5, 15, 0, 0, 229, 234, 3, 46, 23, 0, 230, 231, 5, 16, 0, 0, 231, 233, 3, 46, 23, 0, 232, 230, 1, 0, 0, 0, 233, 236, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 238, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 237, 239, 5, 16, 0, 0, 238, 237, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 241, 1, 0, 0, 0, 240, 229, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 5, 17, 0, 0, 243, 45, 1, 0, 0, 0, 244, 245, 6, 23, -1, 0, 245, 246, 5, 15, 0, 0, 246, 247, 3, 46, 23, 0, 247, 248, 5, 17, 0, 0, 248, 298, 1, 0, 0, 0, 249, 250, 3, 54, 27, 0, 250, 251, 5, 15, 0, 0, 251, 254, 3, 46, 23, 0, 252, 253, 5, 16, 0, 0, 253, 255, 3, 46, 23, 0, 254, 252, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 257, 1, 0, 0, 0, 256, 258, 5, 16, 0, 0, 257, 256, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 260, 5, 17, 0, 0, 260, 298, 1, 0, 0, 0, 261, 298, 3, 42, 21, 0, 262, 263, 5, 22, 0, 0, 263, 264, 5, 69, 0, 0, 264, 298, 3, 44, 22, 0, 265, 266, 5, 25, 0, 0, 266, 267, 5, 23, 0, 0, 267, 268, 3, 46, 23, 0, 268, 269, 5, 24, 0, 0, 269, 270, 7, 2, 0, 0, 270, 298, 1, 0, 0, 0, 271, 272, 5, 31, 0, 0, 272, 273, 5, 23, 0, 0, 273, 274, 3, 46, 23, 0, 274, 275, 5, 24, 0, 0, 275, 276, 7, 3, 0, 0, 276, 298, 1, 0, 0, 0, 277, 278, 7, 4, 0, 0, 278, 298, 3, 46, 23, 14, 279, 291, 5, 23, 0, 0, 280, 285, 3, 46, 23, 0, 281, 282, 5, 16, 0, 0, 282, 284, 3, 46, 23, 0, 283, 281, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 289, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 288, 290, 5, 16, 0, 0, 289, 288, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 292, 1, 0, 0, 0, 291, 280, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 298, 5, 24, 0, 0, 294, 298, 5, 68, 0, 0, 295, 298, 5, 69, 0, 0, 296, 298, 3, 50, 25, 0, 297, 244, 1, 0, 0, 0, 297, 249, 1, 0, 0, 0, 297, 261, 1, 0, 0, 0, 297, 262, 1, 0, 0, 0, 297, 265, 1, 0, 0, 0, 297, 271, 1, 0, 0, 0, 297, 277, 1, 0, 0, 0, 297, 279, 1, 0, 0, 0, 297, 294, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 296, 1, 0, 0, 0, 298, 340, 1, 0, 0, 0, 299, 300, 10, 13, 0, 0, 300, 301, 7, 5, 0, 0, 301, 339, 3, 46, 23, 14, 302, 303, 10, 12, 0, 0, 303, 304, 7, 6, 0, 0, 304, 339, 3, 46, 23, 13, 305, 306, 10, 11, 0, 0, 306, 307, 7, 7, 0, 0, 307, 339, 3, 46, 23, 12, 308, 309, 10, 10, 0, 0, 309, 310, 7, 8, 0, 0, 310, 339, 3, 46, 23, 11, 311, 312, 10, 9, 0, 0, 312, 313, 5, 47, 0, 0, 313, 339, 3, 46, 23, 10, 314, 315, 10, 8, 0, 0, 315, 316, 5, 4, 0, 0, 316, 339, 3, 46, 23, 9, 317, 318, 10, 7, 0, 0, 318, 319, 5, 48, 0, 0, 319, 339, 3, 46, 23, 8, 320, 321, 10, 6, 0, 0, 321, 322, 5, 49, 0, 0, 322, 339, 3, 46, 23, 7, 323, 324, 10, 5, 0, 0, 324, 325, 5, 50, 0, 0, 325, 339, 3, 46, 23, 6, 326, 327, 10, 19, 0, 0, 327, 328, 5, 23, 0, 0, 328, 329, 5, 61, 0, 0, 329, 339, 5, 24, 0, 0, 330, 331, 10, 16, 0, 0, 331, 339, 7, 9, 0, 0, 332, 333, 10, 15, 0, 0, 333, 334, 5, 38, 0, 0, 334, 335, 5, 15, 0, 0, 335, 336, 3, 46, 23, 0, 336, 337, 5, 17, 0, 0, 337, 339, 1, 0, 0, 0, 338, 299, 1, 0, 0, 0, 338, 302, 1, 0, 0, 0, 338, 305, 1, 0, 0, 0, 338, 308, 1, 0, 0, 0, 338, 311, 1, 0, 0, 0, 338, 314, 1, 0, 0, 0, 338, 317, 1, 0, 0, 0, 338, 320, 1, 0, 0, 0, 338, 323, 1, 0, 0, 0, 338, 326, 1, 0, 0, 0, 338, 330, 1, 0, 0, 0, 338, 332, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 47, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 343, 344, 5, 51, 0, 0, 344, 49, 1, 0, 0, 0, 345, 351, 5, 59, 0, 0, 346, 351, 3, 52, 26, 0, 347, 351, 5, 64, 0, 0, 348, 351, 5, 65, 0, 0, 349, 351, 5, 66, 0, 0, 350, 345, 1, 0, 0, 0, 350, 346, 1, 0, 0, 0, 350, 347, 1, 0, 0, 0, 350, 348, 1, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 51, 1, 0, 0, 0, 352, 354, 5, 61, 0, 0, 353, 355, 5, 60, 0, 0, 354, 353, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 53, 1, 0, 0, 0, 356, 357, 7, 10, 0, 0, 357, 55, 1, 0, 0, 0, 31, 59, 74, 77, 90, 102, 113, 117, 119, 130, 135, 144, 150, 179, 189, 201, 215, 219, 221, 234, 238, 240, 254, 257, 285, 289, 291, 297, 338, 340, 350, 354] \ No newline at end of file +[4, 1, 72, 365, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 1, 0, 5, 0, 60, 8, 0, 10, 0, 12, 0, 63, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 3, 3, 3, 77, 8, 3, 1, 4, 3, 4, 80, 8, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 91, 8, 6, 10, 6, 12, 6, 94, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 5, 7, 103, 8, 7, 10, 7, 12, 7, 106, 9, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 114, 8, 8, 10, 8, 12, 8, 117, 9, 8, 1, 8, 3, 8, 120, 8, 8, 3, 8, 122, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 5, 10, 131, 8, 10, 10, 10, 12, 10, 134, 9, 10, 1, 10, 1, 10, 3, 10, 138, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 147, 8, 11, 1, 12, 1, 12, 5, 12, 151, 8, 12, 10, 12, 12, 12, 154, 9, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 182, 8, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 192, 8, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 204, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 3, 20, 214, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 220, 8, 21, 10, 21, 12, 21, 223, 9, 21, 1, 21, 3, 21, 226, 8, 21, 3, 21, 228, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 239, 8, 23, 10, 23, 12, 23, 242, 9, 23, 1, 23, 3, 23, 245, 8, 23, 3, 23, 247, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 261, 8, 24, 1, 24, 3, 24, 264, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 290, 8, 24, 10, 24, 12, 24, 293, 9, 24, 1, 24, 3, 24, 296, 8, 24, 3, 24, 298, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 304, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 345, 8, 24, 10, 24, 12, 24, 348, 9, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 357, 8, 26, 1, 27, 1, 27, 3, 27, 361, 8, 27, 1, 28, 1, 28, 1, 28, 0, 1, 48, 29, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 0, 10, 1, 0, 4, 10, 1, 0, 26, 30, 2, 0, 26, 30, 32, 35, 1, 0, 39, 40, 1, 0, 41, 43, 2, 0, 40, 40, 44, 44, 1, 0, 6, 9, 1, 0, 45, 46, 1, 0, 36, 37, 2, 0, 52, 57, 62, 62, 394, 0, 61, 1, 0, 0, 0, 2, 67, 1, 0, 0, 0, 4, 72, 1, 0, 0, 0, 6, 74, 1, 0, 0, 0, 8, 79, 1, 0, 0, 0, 10, 83, 1, 0, 0, 0, 12, 85, 1, 0, 0, 0, 14, 97, 1, 0, 0, 0, 16, 109, 1, 0, 0, 0, 18, 125, 1, 0, 0, 0, 20, 137, 1, 0, 0, 0, 22, 146, 1, 0, 0, 0, 24, 148, 1, 0, 0, 0, 26, 160, 1, 0, 0, 0, 28, 169, 1, 0, 0, 0, 30, 174, 1, 0, 0, 0, 32, 186, 1, 0, 0, 0, 34, 196, 1, 0, 0, 0, 36, 205, 1, 0, 0, 0, 38, 209, 1, 0, 0, 0, 40, 213, 1, 0, 0, 0, 42, 215, 1, 0, 0, 0, 44, 231, 1, 0, 0, 0, 46, 234, 1, 0, 0, 0, 48, 303, 1, 0, 0, 0, 50, 349, 1, 0, 0, 0, 52, 356, 1, 0, 0, 0, 54, 358, 1, 0, 0, 0, 56, 362, 1, 0, 0, 0, 58, 60, 3, 2, 1, 0, 59, 58, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 64, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 65, 3, 12, 6, 0, 65, 66, 5, 0, 0, 1, 66, 1, 1, 0, 0, 0, 67, 68, 5, 1, 0, 0, 68, 69, 3, 4, 2, 0, 69, 70, 3, 6, 3, 0, 70, 71, 5, 2, 0, 0, 71, 3, 1, 0, 0, 0, 72, 73, 5, 3, 0, 0, 73, 5, 1, 0, 0, 0, 74, 76, 3, 8, 4, 0, 75, 77, 3, 8, 4, 0, 76, 75, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 7, 1, 0, 0, 0, 78, 80, 3, 10, 5, 0, 79, 78, 1, 0, 0, 0, 79, 80, 1, 0, 0, 0, 80, 81, 1, 0, 0, 0, 81, 82, 5, 58, 0, 0, 82, 9, 1, 0, 0, 0, 83, 84, 7, 0, 0, 0, 84, 11, 1, 0, 0, 0, 85, 86, 5, 11, 0, 0, 86, 87, 5, 69, 0, 0, 87, 88, 3, 16, 8, 0, 88, 92, 5, 12, 0, 0, 89, 91, 3, 14, 7, 0, 90, 89, 1, 0, 0, 0, 91, 94, 1, 0, 0, 0, 92, 90, 1, 0, 0, 0, 92, 93, 1, 0, 0, 0, 93, 95, 1, 0, 0, 0, 94, 92, 1, 0, 0, 0, 95, 96, 5, 13, 0, 0, 96, 13, 1, 0, 0, 0, 97, 98, 5, 14, 0, 0, 98, 99, 5, 69, 0, 0, 99, 100, 3, 16, 8, 0, 100, 104, 5, 12, 0, 0, 101, 103, 3, 22, 11, 0, 102, 101, 1, 0, 0, 0, 103, 106, 1, 0, 0, 0, 104, 102, 1, 0, 0, 0, 104, 105, 1, 0, 0, 0, 105, 107, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 107, 108, 5, 13, 0, 0, 108, 15, 1, 0, 0, 0, 109, 121, 5, 15, 0, 0, 110, 115, 3, 18, 9, 0, 111, 112, 5, 16, 0, 0, 112, 114, 3, 18, 9, 0, 113, 111, 1, 0, 0, 0, 114, 117, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 118, 120, 5, 16, 0, 0, 119, 118, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 122, 1, 0, 0, 0, 121, 110, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 123, 1, 0, 0, 0, 123, 124, 5, 17, 0, 0, 124, 17, 1, 0, 0, 0, 125, 126, 3, 56, 28, 0, 126, 127, 5, 69, 0, 0, 127, 19, 1, 0, 0, 0, 128, 132, 5, 12, 0, 0, 129, 131, 3, 22, 11, 0, 130, 129, 1, 0, 0, 0, 131, 134, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 135, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 135, 138, 5, 13, 0, 0, 136, 138, 3, 22, 11, 0, 137, 128, 1, 0, 0, 0, 137, 136, 1, 0, 0, 0, 138, 21, 1, 0, 0, 0, 139, 147, 3, 24, 12, 0, 140, 147, 3, 26, 13, 0, 141, 147, 3, 28, 14, 0, 142, 147, 3, 30, 15, 0, 143, 147, 3, 32, 16, 0, 144, 147, 3, 34, 17, 0, 145, 147, 3, 36, 18, 0, 146, 139, 1, 0, 0, 0, 146, 140, 1, 0, 0, 0, 146, 141, 1, 0, 0, 0, 146, 142, 1, 0, 0, 0, 146, 143, 1, 0, 0, 0, 146, 144, 1, 0, 0, 0, 146, 145, 1, 0, 0, 0, 147, 23, 1, 0, 0, 0, 148, 152, 3, 56, 28, 0, 149, 151, 3, 50, 25, 0, 150, 149, 1, 0, 0, 0, 151, 154, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 155, 1, 0, 0, 0, 154, 152, 1, 0, 0, 0, 155, 156, 5, 69, 0, 0, 156, 157, 5, 10, 0, 0, 157, 158, 3, 48, 24, 0, 158, 159, 5, 2, 0, 0, 159, 25, 1, 0, 0, 0, 160, 161, 3, 56, 28, 0, 161, 162, 5, 69, 0, 0, 162, 163, 5, 16, 0, 0, 163, 164, 3, 56, 28, 0, 164, 165, 5, 69, 0, 0, 165, 166, 5, 10, 0, 0, 166, 167, 3, 48, 24, 0, 167, 168, 5, 2, 0, 0, 168, 27, 1, 0, 0, 0, 169, 170, 5, 69, 0, 0, 170, 171, 5, 10, 0, 0, 171, 172, 3, 48, 24, 0, 172, 173, 5, 2, 0, 0, 173, 29, 1, 0, 0, 0, 174, 175, 5, 18, 0, 0, 175, 176, 5, 15, 0, 0, 176, 177, 5, 67, 0, 0, 177, 178, 5, 6, 0, 0, 178, 181, 3, 48, 24, 0, 179, 180, 5, 16, 0, 0, 180, 182, 3, 38, 19, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 184, 5, 17, 0, 0, 184, 185, 5, 2, 0, 0, 185, 31, 1, 0, 0, 0, 186, 187, 5, 18, 0, 0, 187, 188, 5, 15, 0, 0, 188, 191, 3, 48, 24, 0, 189, 190, 5, 16, 0, 0, 190, 192, 3, 38, 19, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 194, 5, 17, 0, 0, 194, 195, 5, 2, 0, 0, 195, 33, 1, 0, 0, 0, 196, 197, 5, 19, 0, 0, 197, 198, 5, 15, 0, 0, 198, 199, 3, 48, 24, 0, 199, 200, 5, 17, 0, 0, 200, 203, 3, 20, 10, 0, 201, 202, 5, 20, 0, 0, 202, 204, 3, 20, 10, 0, 203, 201, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 35, 1, 0, 0, 0, 205, 206, 5, 21, 0, 0, 206, 207, 3, 42, 21, 0, 207, 208, 5, 2, 0, 0, 208, 37, 1, 0, 0, 0, 209, 210, 5, 64, 0, 0, 210, 39, 1, 0, 0, 0, 211, 214, 5, 69, 0, 0, 212, 214, 3, 52, 26, 0, 213, 211, 1, 0, 0, 0, 213, 212, 1, 0, 0, 0, 214, 41, 1, 0, 0, 0, 215, 227, 5, 15, 0, 0, 216, 221, 3, 40, 20, 0, 217, 218, 5, 16, 0, 0, 218, 220, 3, 40, 20, 0, 219, 217, 1, 0, 0, 0, 220, 223, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 221, 222, 1, 0, 0, 0, 222, 225, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 224, 226, 5, 16, 0, 0, 225, 224, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 228, 1, 0, 0, 0, 227, 216, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 229, 1, 0, 0, 0, 229, 230, 5, 17, 0, 0, 230, 43, 1, 0, 0, 0, 231, 232, 5, 69, 0, 0, 232, 233, 3, 46, 23, 0, 233, 45, 1, 0, 0, 0, 234, 246, 5, 15, 0, 0, 235, 240, 3, 48, 24, 0, 236, 237, 5, 16, 0, 0, 237, 239, 3, 48, 24, 0, 238, 236, 1, 0, 0, 0, 239, 242, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 244, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 243, 245, 5, 16, 0, 0, 244, 243, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 247, 1, 0, 0, 0, 246, 235, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 17, 0, 0, 249, 47, 1, 0, 0, 0, 250, 251, 6, 24, -1, 0, 251, 252, 5, 15, 0, 0, 252, 253, 3, 48, 24, 0, 253, 254, 5, 17, 0, 0, 254, 304, 1, 0, 0, 0, 255, 256, 3, 56, 28, 0, 256, 257, 5, 15, 0, 0, 257, 260, 3, 48, 24, 0, 258, 259, 5, 16, 0, 0, 259, 261, 3, 48, 24, 0, 260, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 263, 1, 0, 0, 0, 262, 264, 5, 16, 0, 0, 263, 262, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 17, 0, 0, 266, 304, 1, 0, 0, 0, 267, 304, 3, 44, 22, 0, 268, 269, 5, 22, 0, 0, 269, 270, 5, 69, 0, 0, 270, 304, 3, 46, 23, 0, 271, 272, 5, 25, 0, 0, 272, 273, 5, 23, 0, 0, 273, 274, 3, 48, 24, 0, 274, 275, 5, 24, 0, 0, 275, 276, 7, 1, 0, 0, 276, 304, 1, 0, 0, 0, 277, 278, 5, 31, 0, 0, 278, 279, 5, 23, 0, 0, 279, 280, 3, 48, 24, 0, 280, 281, 5, 24, 0, 0, 281, 282, 7, 2, 0, 0, 282, 304, 1, 0, 0, 0, 283, 284, 7, 3, 0, 0, 284, 304, 3, 48, 24, 14, 285, 297, 5, 23, 0, 0, 286, 291, 3, 48, 24, 0, 287, 288, 5, 16, 0, 0, 288, 290, 3, 48, 24, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 296, 5, 16, 0, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 298, 1, 0, 0, 0, 297, 286, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 299, 1, 0, 0, 0, 299, 304, 5, 24, 0, 0, 300, 304, 5, 68, 0, 0, 301, 304, 5, 69, 0, 0, 302, 304, 3, 52, 26, 0, 303, 250, 1, 0, 0, 0, 303, 255, 1, 0, 0, 0, 303, 267, 1, 0, 0, 0, 303, 268, 1, 0, 0, 0, 303, 271, 1, 0, 0, 0, 303, 277, 1, 0, 0, 0, 303, 283, 1, 0, 0, 0, 303, 285, 1, 0, 0, 0, 303, 300, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 302, 1, 0, 0, 0, 304, 346, 1, 0, 0, 0, 305, 306, 10, 13, 0, 0, 306, 307, 7, 4, 0, 0, 307, 345, 3, 48, 24, 14, 308, 309, 10, 12, 0, 0, 309, 310, 7, 5, 0, 0, 310, 345, 3, 48, 24, 13, 311, 312, 10, 11, 0, 0, 312, 313, 7, 6, 0, 0, 313, 345, 3, 48, 24, 12, 314, 315, 10, 10, 0, 0, 315, 316, 7, 7, 0, 0, 316, 345, 3, 48, 24, 11, 317, 318, 10, 9, 0, 0, 318, 319, 5, 47, 0, 0, 319, 345, 3, 48, 24, 10, 320, 321, 10, 8, 0, 0, 321, 322, 5, 4, 0, 0, 322, 345, 3, 48, 24, 9, 323, 324, 10, 7, 0, 0, 324, 325, 5, 48, 0, 0, 325, 345, 3, 48, 24, 8, 326, 327, 10, 6, 0, 0, 327, 328, 5, 49, 0, 0, 328, 345, 3, 48, 24, 7, 329, 330, 10, 5, 0, 0, 330, 331, 5, 50, 0, 0, 331, 345, 3, 48, 24, 6, 332, 333, 10, 19, 0, 0, 333, 334, 5, 23, 0, 0, 334, 335, 5, 61, 0, 0, 335, 345, 5, 24, 0, 0, 336, 337, 10, 16, 0, 0, 337, 345, 7, 8, 0, 0, 338, 339, 10, 15, 0, 0, 339, 340, 5, 38, 0, 0, 340, 341, 5, 15, 0, 0, 341, 342, 3, 48, 24, 0, 342, 343, 5, 17, 0, 0, 343, 345, 1, 0, 0, 0, 344, 305, 1, 0, 0, 0, 344, 308, 1, 0, 0, 0, 344, 311, 1, 0, 0, 0, 344, 314, 1, 0, 0, 0, 344, 317, 1, 0, 0, 0, 344, 320, 1, 0, 0, 0, 344, 323, 1, 0, 0, 0, 344, 326, 1, 0, 0, 0, 344, 329, 1, 0, 0, 0, 344, 332, 1, 0, 0, 0, 344, 336, 1, 0, 0, 0, 344, 338, 1, 0, 0, 0, 345, 348, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 49, 1, 0, 0, 0, 348, 346, 1, 0, 0, 0, 349, 350, 5, 51, 0, 0, 350, 51, 1, 0, 0, 0, 351, 357, 5, 59, 0, 0, 352, 357, 3, 54, 27, 0, 353, 357, 5, 64, 0, 0, 354, 357, 5, 65, 0, 0, 355, 357, 5, 66, 0, 0, 356, 351, 1, 0, 0, 0, 356, 352, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 53, 1, 0, 0, 0, 358, 360, 5, 61, 0, 0, 359, 361, 5, 60, 0, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 55, 1, 0, 0, 0, 362, 363, 7, 9, 0, 0, 363, 57, 1, 0, 0, 0, 32, 61, 76, 79, 92, 104, 115, 119, 121, 132, 137, 146, 152, 181, 191, 203, 213, 221, 225, 227, 240, 244, 246, 260, 263, 291, 295, 297, 303, 344, 346, 356, 360] \ No newline at end of file diff --git a/packages/cashc/src/grammar/CashScriptParser.ts b/packages/cashc/src/grammar/CashScriptParser.ts index 88ca96fb..834c589b 100644 --- a/packages/cashc/src/grammar/CashScriptParser.ts +++ b/packages/cashc/src/grammar/CashScriptParser.ts @@ -110,104 +110,105 @@ export default class CashScriptParser extends Parser { public static readonly RULE_requireStatement = 16; public static readonly RULE_ifStatement = 17; public static readonly RULE_consoleStatement = 18; - public static readonly RULE_consoleParameter = 19; - public static readonly RULE_consoleParameterList = 20; - public static readonly RULE_functionCall = 21; - public static readonly RULE_expressionList = 22; - public static readonly RULE_expression = 23; - public static readonly RULE_modifier = 24; - public static readonly RULE_literal = 25; - public static readonly RULE_numberLiteral = 26; - public static readonly RULE_typeName = 27; - public static readonly literalNames: (string | null)[] = [ null, "'pragma'", - "';'", "'cashscript'", - "'^'", "'~'", - "'>='", "'>'", - "'<'", "'<='", - "'='", "'contract'", - "'{'", "'}'", - "'function'", - "'('", "','", - "')'", "'require'", - "'if'", "'else'", - "'console.log'", - "'new'", "'['", - "']'", "'tx.outputs'", - "'.value'", - "'.lockingBytecode'", - "'.tokenCategory'", - "'.nftCommitment'", - "'.tokenAmount'", - "'tx.inputs'", - "'.outpointTransactionHash'", - "'.outpointIndex'", - "'.unlockingBytecode'", - "'.sequenceNumber'", - "'.reverse()'", - "'.length'", - "'.split'", - "'!'", "'-'", - "'*'", "'/'", - "'%'", "'+'", - "'=='", "'!='", - "'&'", "'|'", - "'&&'", "'||'", - "'constant'", - "'int'", "'bool'", - "'string'", - "'pubkey'", + public static readonly RULE_requireMessage = 19; + public static readonly RULE_consoleParameter = 20; + public static readonly RULE_consoleParameterList = 21; + public static readonly RULE_functionCall = 22; + public static readonly RULE_expressionList = 23; + public static readonly RULE_expression = 24; + public static readonly RULE_modifier = 25; + public static readonly RULE_literal = 26; + public static readonly RULE_numberLiteral = 27; + public static readonly RULE_typeName = 28; + public static readonly literalNames: (string | null)[] = [ null, "'pragma'", + "';'", "'cashscript'", + "'^'", "'~'", + "'>='", "'>'", + "'<'", "'<='", + "'='", "'contract'", + "'{'", "'}'", + "'function'", + "'('", "','", + "')'", "'require'", + "'if'", "'else'", + "'console.log'", + "'new'", "'['", + "']'", "'tx.outputs'", + "'.value'", + "'.lockingBytecode'", + "'.tokenCategory'", + "'.nftCommitment'", + "'.tokenAmount'", + "'tx.inputs'", + "'.outpointTransactionHash'", + "'.outpointIndex'", + "'.unlockingBytecode'", + "'.sequenceNumber'", + "'.reverse()'", + "'.length'", + "'.split'", + "'!'", "'-'", + "'*'", "'/'", + "'%'", "'+'", + "'=='", "'!='", + "'&'", "'|'", + "'&&'", "'||'", + "'constant'", + "'int'", "'bool'", + "'string'", + "'pubkey'", "'sig'", "'datasig'" ]; - public static readonly symbolicNames: (string | null)[] = [ null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - "VersionLiteral", - "BooleanLiteral", - "NumberUnit", - "NumberLiteral", - "Bytes", "Bound", - "StringLiteral", - "DateLiteral", - "HexLiteral", - "TxVar", "NullaryOp", - "Identifier", - "WHITESPACE", - "COMMENT", + public static readonly symbolicNames: (string | null)[] = [ null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + "VersionLiteral", + "BooleanLiteral", + "NumberUnit", + "NumberLiteral", + "Bytes", "Bound", + "StringLiteral", + "DateLiteral", + "HexLiteral", + "TxVar", "NullaryOp", + "Identifier", + "WHITESPACE", + "COMMENT", "LINE_COMMENT" ]; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ - "sourceFile", "pragmaDirective", "pragmaName", "pragmaValue", "versionConstraint", - "versionOperator", "contractDefinition", "functionDefinition", "parameterList", - "parameter", "block", "statement", "variableDefinition", "tupleAssignment", - "assignStatement", "timeOpStatement", "requireStatement", "ifStatement", - "consoleStatement", "consoleParameter", "consoleParameterList", "functionCall", - "expressionList", "expression", "modifier", "literal", "numberLiteral", - "typeName", + "sourceFile", "pragmaDirective", "pragmaName", "pragmaValue", "versionConstraint", + "versionOperator", "contractDefinition", "functionDefinition", "parameterList", + "parameter", "block", "statement", "variableDefinition", "tupleAssignment", + "assignStatement", "timeOpStatement", "requireStatement", "ifStatement", + "consoleStatement", "requireMessage", "consoleParameter", "consoleParameterList", + "functionCall", "expressionList", "expression", "modifier", "literal", + "numberLiteral", "typeName", ]; public get grammarFileName(): string { return "CashScript.g4"; } public get literalNames(): (string | null)[] { return CashScriptParser.literalNames; } @@ -231,23 +232,23 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 59; + this.state = 61; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===1) { { { - this.state = 56; + this.state = 58; this.pragmaDirective(); } } - this.state = 61; + this.state = 63; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 62; + this.state = 64; this.contractDefinition(); - this.state = 63; + this.state = 65; this.match(CashScriptParser.EOF); } } @@ -272,13 +273,13 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 65; + this.state = 67; this.match(CashScriptParser.T__0); - this.state = 66; + this.state = 68; this.pragmaName(); - this.state = 67; + this.state = 69; this.pragmaValue(); - this.state = 68; + this.state = 70; this.match(CashScriptParser.T__1); } } @@ -303,7 +304,7 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 70; + this.state = 72; this.match(CashScriptParser.T__2); } } @@ -329,14 +330,14 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 72; - this.versionConstraint(); this.state = 74; + this.versionConstraint(); + this.state = 76; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2032) !== 0) || _la===58) { { - this.state = 73; + this.state = 75; this.versionConstraint(); } } @@ -365,17 +366,17 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 77; + this.state = 79; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2032) !== 0)) { { - this.state = 76; + this.state = 78; this.versionOperator(); } } - this.state = 79; + this.state = 81; this.match(CashScriptParser.VersionLiteral); } } @@ -401,7 +402,7 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 81; + this.state = 83; _la = this._input.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 2032) !== 0))) { this._errHandler.recoverInline(this); @@ -434,29 +435,29 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 83; + this.state = 85; this.match(CashScriptParser.T__10); - this.state = 84; + this.state = 86; this.match(CashScriptParser.Identifier); - this.state = 85; + this.state = 87; this.parameterList(); - this.state = 86; + this.state = 88; this.match(CashScriptParser.T__11); - this.state = 90; + this.state = 92; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===14) { { { - this.state = 87; + this.state = 89; this.functionDefinition(); } } - this.state = 92; + this.state = 94; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 93; + this.state = 95; this.match(CashScriptParser.T__12); } } @@ -482,29 +483,29 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 95; + this.state = 97; this.match(CashScriptParser.T__13); - this.state = 96; + this.state = 98; this.match(CashScriptParser.Identifier); - this.state = 97; + this.state = 99; this.parameterList(); - this.state = 98; + this.state = 100; this.match(CashScriptParser.T__11); - this.state = 102; + this.state = 104; this._errHandler.sync(this); _la = this._input.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2883584) !== 0) || ((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 132159) !== 0)) { { { - this.state = 99; + this.state = 101; this.statement(); } } - this.state = 104; + this.state = 106; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 105; + this.state = 107; this.match(CashScriptParser.T__12); } } @@ -531,39 +532,39 @@ export default class CashScriptParser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 107; + this.state = 109; this.match(CashScriptParser.T__14); - this.state = 119; + this.state = 121; this._errHandler.sync(this); _la = this._input.LA(1); if (((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 1087) !== 0)) { { - this.state = 108; + this.state = 110; this.parameter(); - this.state = 113; + this.state = 115; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 5, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 109; + this.state = 111; this.match(CashScriptParser.T__15); - this.state = 110; + this.state = 112; this.parameter(); } } } - this.state = 115; + this.state = 117; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 5, this._ctx); } - this.state = 117; + this.state = 119; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 116; + this.state = 118; this.match(CashScriptParser.T__15); } } @@ -571,7 +572,7 @@ export default class CashScriptParser extends Parser { } } - this.state = 121; + this.state = 123; this.match(CashScriptParser.T__16); } } @@ -596,9 +597,9 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 123; + this.state = 125; this.typeName(); - this.state = 124; + this.state = 126; this.match(CashScriptParser.Identifier); } } @@ -622,29 +623,29 @@ export default class CashScriptParser extends Parser { this.enterRule(localctx, 20, CashScriptParser.RULE_block); let _la: number; try { - this.state = 135; + this.state = 137; this._errHandler.sync(this); switch (this._input.LA(1)) { case 12: this.enterOuterAlt(localctx, 1); { - this.state = 126; + this.state = 128; this.match(CashScriptParser.T__11); - this.state = 130; + this.state = 132; this._errHandler.sync(this); _la = this._input.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2883584) !== 0) || ((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 132159) !== 0)) { { { - this.state = 127; + this.state = 129; this.statement(); } } - this.state = 132; + this.state = 134; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 133; + this.state = 135; this.match(CashScriptParser.T__12); } break; @@ -661,7 +662,7 @@ export default class CashScriptParser extends Parser { case 69: this.enterOuterAlt(localctx, 2); { - this.state = 134; + this.state = 136; this.statement(); } break; @@ -688,55 +689,55 @@ export default class CashScriptParser extends Parser { let localctx: StatementContext = new StatementContext(this, this._ctx, this.state); this.enterRule(localctx, 22, CashScriptParser.RULE_statement); try { - this.state = 144; + this.state = 146; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 10, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 137; + this.state = 139; this.variableDefinition(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 138; + this.state = 140; this.tupleAssignment(); } break; case 3: this.enterOuterAlt(localctx, 3); { - this.state = 139; + this.state = 141; this.assignStatement(); } break; case 4: this.enterOuterAlt(localctx, 4); { - this.state = 140; + this.state = 142; this.timeOpStatement(); } break; case 5: this.enterOuterAlt(localctx, 5); { - this.state = 141; + this.state = 143; this.requireStatement(); } break; case 6: this.enterOuterAlt(localctx, 6); { - this.state = 142; + this.state = 144; this.ifStatement(); } break; case 7: this.enterOuterAlt(localctx, 7); { - this.state = 143; + this.state = 145; this.consoleStatement(); } break; @@ -764,29 +765,29 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 146; + this.state = 148; this.typeName(); - this.state = 150; + this.state = 152; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===51) { { { - this.state = 147; + this.state = 149; this.modifier(); } } - this.state = 152; + this.state = 154; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 153; + this.state = 155; this.match(CashScriptParser.Identifier); - this.state = 154; + this.state = 156; this.match(CashScriptParser.T__9); - this.state = 155; + this.state = 157; this.expression(0); - this.state = 156; + this.state = 158; this.match(CashScriptParser.T__1); } } @@ -811,21 +812,21 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 158; + this.state = 160; this.typeName(); - this.state = 159; + this.state = 161; this.match(CashScriptParser.Identifier); - this.state = 160; + this.state = 162; this.match(CashScriptParser.T__15); - this.state = 161; + this.state = 163; this.typeName(); - this.state = 162; + this.state = 164; this.match(CashScriptParser.Identifier); - this.state = 163; + this.state = 165; this.match(CashScriptParser.T__9); - this.state = 164; + this.state = 166; this.expression(0); - this.state = 165; + this.state = 167; this.match(CashScriptParser.T__1); } } @@ -850,13 +851,13 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 167; + this.state = 169; this.match(CashScriptParser.Identifier); - this.state = 168; + this.state = 170; this.match(CashScriptParser.T__9); - this.state = 169; + this.state = 171; this.expression(0); - this.state = 170; + this.state = 172; this.match(CashScriptParser.T__1); } } @@ -882,31 +883,31 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 172; + this.state = 174; this.match(CashScriptParser.T__17); - this.state = 173; + this.state = 175; this.match(CashScriptParser.T__14); - this.state = 174; + this.state = 176; this.match(CashScriptParser.TxVar); - this.state = 175; + this.state = 177; this.match(CashScriptParser.T__5); - this.state = 176; + this.state = 178; this.expression(0); - this.state = 179; + this.state = 181; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 177; + this.state = 179; this.match(CashScriptParser.T__15); - this.state = 178; - this.match(CashScriptParser.StringLiteral); + this.state = 180; + this.requireMessage(); } } - this.state = 181; + this.state = 183; this.match(CashScriptParser.T__16); - this.state = 182; + this.state = 184; this.match(CashScriptParser.T__1); } } @@ -932,27 +933,27 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 184; + this.state = 186; this.match(CashScriptParser.T__17); - this.state = 185; + this.state = 187; this.match(CashScriptParser.T__14); - this.state = 186; + this.state = 188; this.expression(0); - this.state = 189; + this.state = 191; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 187; + this.state = 189; this.match(CashScriptParser.T__15); - this.state = 188; - this.match(CashScriptParser.StringLiteral); + this.state = 190; + this.requireMessage(); } } - this.state = 191; + this.state = 193; this.match(CashScriptParser.T__16); - this.state = 192; + this.state = 194; this.match(CashScriptParser.T__1); } } @@ -977,24 +978,24 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 194; + this.state = 196; this.match(CashScriptParser.T__18); - this.state = 195; + this.state = 197; this.match(CashScriptParser.T__14); - this.state = 196; + this.state = 198; this.expression(0); - this.state = 197; + this.state = 199; this.match(CashScriptParser.T__16); - this.state = 198; + this.state = 200; localctx._ifBlock = this.block(); - this.state = 201; + this.state = 203; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: { - this.state = 199; + this.state = 201; this.match(CashScriptParser.T__19); - this.state = 200; + this.state = 202; localctx._elseBlock = this.block(); } break; @@ -1022,11 +1023,11 @@ export default class CashScriptParser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 203; + this.state = 205; this.match(CashScriptParser.T__20); - this.state = 204; + this.state = 206; this.consoleParameterList(); - this.state = 205; + this.state = 207; this.match(CashScriptParser.T__1); } } @@ -1045,22 +1046,58 @@ export default class CashScriptParser extends Parser { return localctx; } // @RuleVersion(0) - public consoleParameter(): ConsoleParameterContext { - let localctx: ConsoleParameterContext = new ConsoleParameterContext(this, this._ctx, this.state); - this.enterRule(localctx, 38, CashScriptParser.RULE_consoleParameter); - let _la: number; + public requireMessage(): RequireMessageContext { + let localctx: RequireMessageContext = new RequireMessageContext(this, this._ctx, this.state); + this.enterRule(localctx, 38, CashScriptParser.RULE_requireMessage); try { this.enterOuterAlt(localctx, 1); { - this.state = 207; - _la = this._input.LA(1); - if(!(((((_la - 59)) & ~0x1F) === 0 && ((1 << (_la - 59)) & 1189) !== 0))) { - this._errHandler.recoverInline(this); + this.state = 209; + this.match(CashScriptParser.StringLiteral); } - else { - 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; + } + // @RuleVersion(0) + public consoleParameter(): ConsoleParameterContext { + let localctx: ConsoleParameterContext = new ConsoleParameterContext(this, this._ctx, this.state); + this.enterRule(localctx, 40, CashScriptParser.RULE_consoleParameter); + try { + this.state = 213; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case 69: + this.enterOuterAlt(localctx, 1); + { + this.state = 211; + this.match(CashScriptParser.Identifier); + } + break; + case 59: + case 61: + case 64: + case 65: + case 66: + this.enterOuterAlt(localctx, 2); + { + this.state = 212; + this.literal(); + } + break; + default: + throw new NoViableAltException(this); } } catch (re) { @@ -1080,45 +1117,45 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public consoleParameterList(): ConsoleParameterListContext { let localctx: ConsoleParameterListContext = new ConsoleParameterListContext(this, this._ctx, this.state); - this.enterRule(localctx, 40, CashScriptParser.RULE_consoleParameterList); + this.enterRule(localctx, 42, CashScriptParser.RULE_consoleParameterList); let _la: number; try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 209; + this.state = 215; this.match(CashScriptParser.T__14); - this.state = 221; + this.state = 227; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 59)) & ~0x1F) === 0 && ((1 << (_la - 59)) & 1189) !== 0)) { + if (((((_la - 59)) & ~0x1F) === 0 && ((1 << (_la - 59)) & 1253) !== 0)) { { - this.state = 210; + this.state = 216; this.consoleParameter(); - this.state = 215; + this.state = 221; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 16, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 211; + this.state = 217; this.match(CashScriptParser.T__15); - this.state = 212; + this.state = 218; this.consoleParameter(); } } } - this.state = 217; + this.state = 223; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 16, this._ctx); } - this.state = 219; + this.state = 225; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 218; + this.state = 224; this.match(CashScriptParser.T__15); } } @@ -1126,7 +1163,7 @@ export default class CashScriptParser extends Parser { } } - this.state = 223; + this.state = 229; this.match(CashScriptParser.T__16); } } @@ -1147,13 +1184,13 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public functionCall(): FunctionCallContext { let localctx: FunctionCallContext = new FunctionCallContext(this, this._ctx, this.state); - this.enterRule(localctx, 42, CashScriptParser.RULE_functionCall); + this.enterRule(localctx, 44, CashScriptParser.RULE_functionCall); try { this.enterOuterAlt(localctx, 1); { - this.state = 225; + this.state = 231; this.match(CashScriptParser.Identifier); - this.state = 226; + this.state = 232; this.expressionList(); } } @@ -1174,45 +1211,45 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public expressionList(): ExpressionListContext { let localctx: ExpressionListContext = new ExpressionListContext(this, this._ctx, this.state); - this.enterRule(localctx, 44, CashScriptParser.RULE_expressionList); + this.enterRule(localctx, 46, CashScriptParser.RULE_expressionList); let _la: number; try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 228; + this.state = 234; this.match(CashScriptParser.T__14); - this.state = 240; + this.state = 246; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2193653760) !== 0) || ((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 1859641347) !== 0)) { { - this.state = 229; + this.state = 235; this.expression(0); - this.state = 234; + this.state = 240; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 18, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 19, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 230; + this.state = 236; this.match(CashScriptParser.T__15); - this.state = 231; + this.state = 237; this.expression(0); } } } - this.state = 236; + this.state = 242; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 18, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 19, this._ctx); } - this.state = 238; + this.state = 244; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 237; + this.state = 243; this.match(CashScriptParser.T__15); } } @@ -1220,7 +1257,7 @@ export default class CashScriptParser extends Parser { } } - this.state = 242; + this.state = 248; this.match(CashScriptParser.T__16); } } @@ -1251,27 +1288,27 @@ export default class CashScriptParser extends Parser { let _parentState: number = this.state; let localctx: ExpressionContext = new ExpressionContext(this, this._ctx, _parentState); let _prevctx: ExpressionContext = localctx; - let _startState: number = 46; - this.enterRecursionRule(localctx, 46, CashScriptParser.RULE_expression, _p); + let _startState: number = 48; + this.enterRecursionRule(localctx, 48, CashScriptParser.RULE_expression, _p); let _la: number; try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 297; + this.state = 303; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 26, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { case 1: { localctx = new ParenthesisedContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 245; + this.state = 251; this.match(CashScriptParser.T__14); - this.state = 246; + this.state = 252; this.expression(0); - this.state = 247; + this.state = 253; this.match(CashScriptParser.T__16); } break; @@ -1280,35 +1317,35 @@ export default class CashScriptParser extends Parser { localctx = new CastContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 249; + this.state = 255; this.typeName(); - this.state = 250; + this.state = 256; this.match(CashScriptParser.T__14); - this.state = 251; + this.state = 257; (localctx as CastContext)._castable = this.expression(0); - this.state = 254; + this.state = 260; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 22, this._ctx) ) { case 1: { - this.state = 252; + this.state = 258; this.match(CashScriptParser.T__15); - this.state = 253; + this.state = 259; (localctx as CastContext)._size = this.expression(0); } break; } - this.state = 257; + this.state = 263; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 256; + this.state = 262; this.match(CashScriptParser.T__15); } } - this.state = 259; + this.state = 265; this.match(CashScriptParser.T__16); } break; @@ -1317,7 +1354,7 @@ export default class CashScriptParser extends Parser { localctx = new FunctionCallExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 261; + this.state = 267; this.functionCall(); } break; @@ -1326,11 +1363,11 @@ export default class CashScriptParser extends Parser { localctx = new InstantiationContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 262; + this.state = 268; this.match(CashScriptParser.T__21); - this.state = 263; + this.state = 269; this.match(CashScriptParser.Identifier); - this.state = 264; + this.state = 270; this.expressionList(); } break; @@ -1339,15 +1376,15 @@ export default class CashScriptParser extends Parser { localctx = new UnaryIntrospectionOpContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 265; + this.state = 271; (localctx as UnaryIntrospectionOpContext)._scope = this.match(CashScriptParser.T__24); - this.state = 266; + this.state = 272; this.match(CashScriptParser.T__22); - this.state = 267; + this.state = 273; this.expression(0); - this.state = 268; + this.state = 274; this.match(CashScriptParser.T__23); - this.state = 269; + this.state = 275; (localctx as UnaryIntrospectionOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 2080374784) !== 0))) { @@ -1364,15 +1401,15 @@ export default class CashScriptParser extends Parser { localctx = new UnaryIntrospectionOpContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 271; + this.state = 277; (localctx as UnaryIntrospectionOpContext)._scope = this.match(CashScriptParser.T__30); - this.state = 272; + this.state = 278; this.match(CashScriptParser.T__22); - this.state = 273; + this.state = 279; this.expression(0); - this.state = 274; + this.state = 280; this.match(CashScriptParser.T__23); - this.state = 275; + this.state = 281; (localctx as UnaryIntrospectionOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!(((((_la - 26)) & ~0x1F) === 0 && ((1 << (_la - 26)) & 991) !== 0))) { @@ -1389,7 +1426,7 @@ export default class CashScriptParser extends Parser { localctx = new UnaryOpContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 277; + this.state = 283; (localctx as UnaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!(_la===39 || _la===40)) { @@ -1399,7 +1436,7 @@ export default class CashScriptParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 278; + this.state = 284; this.expression(14); } break; @@ -1408,39 +1445,39 @@ export default class CashScriptParser extends Parser { localctx = new ArrayContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 279; + this.state = 285; this.match(CashScriptParser.T__22); - this.state = 291; + this.state = 297; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2193653760) !== 0) || ((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 1859641347) !== 0)) { { - this.state = 280; + this.state = 286; this.expression(0); - this.state = 285; + this.state = 291; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 23, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 24, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 281; + this.state = 287; this.match(CashScriptParser.T__15); - this.state = 282; + this.state = 288; this.expression(0); } } } - this.state = 287; + this.state = 293; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 23, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 24, this._ctx); } - this.state = 289; + this.state = 295; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===16) { { - this.state = 288; + this.state = 294; this.match(CashScriptParser.T__15); } } @@ -1448,7 +1485,7 @@ export default class CashScriptParser extends Parser { } } - this.state = 293; + this.state = 299; this.match(CashScriptParser.T__23); } break; @@ -1457,7 +1494,7 @@ export default class CashScriptParser extends Parser { localctx = new NullaryOpContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 294; + this.state = 300; this.match(CashScriptParser.NullaryOp); } break; @@ -1466,7 +1503,7 @@ export default class CashScriptParser extends Parser { localctx = new IdentifierContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 295; + this.state = 301; this.match(CashScriptParser.Identifier); } break; @@ -1475,15 +1512,15 @@ export default class CashScriptParser extends Parser { localctx = new LiteralExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 296; + this.state = 302; this.literal(); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 340; + this.state = 346; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 28, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 29, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { if (this._parseListeners != null) { @@ -1491,19 +1528,19 @@ export default class CashScriptParser extends Parser { } _prevctx = localctx; { - this.state = 338; + this.state = 344; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { case 1: { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 299; + this.state = 305; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 300; + this.state = 306; (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!(((((_la - 41)) & ~0x1F) === 0 && ((1 << (_la - 41)) & 7) !== 0))) { @@ -1513,7 +1550,7 @@ export default class CashScriptParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 301; + this.state = 307; (localctx as BinaryOpContext)._right = this.expression(14); } break; @@ -1522,11 +1559,11 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 302; + this.state = 308; if (!(this.precpred(this._ctx, 12))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); } - this.state = 303; + this.state = 309; (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!(_la===40 || _la===44)) { @@ -1536,7 +1573,7 @@ export default class CashScriptParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 304; + this.state = 310; (localctx as BinaryOpContext)._right = this.expression(13); } break; @@ -1545,11 +1582,11 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 305; + this.state = 311; if (!(this.precpred(this._ctx, 11))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 11)"); } - this.state = 306; + this.state = 312; (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 960) !== 0))) { @@ -1559,7 +1596,7 @@ export default class CashScriptParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 307; + this.state = 313; (localctx as BinaryOpContext)._right = this.expression(12); } break; @@ -1568,11 +1605,11 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 308; + this.state = 314; if (!(this.precpred(this._ctx, 10))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 10)"); } - this.state = 309; + this.state = 315; (localctx as BinaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!(_la===45 || _la===46)) { @@ -1582,7 +1619,7 @@ export default class CashScriptParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 310; + this.state = 316; (localctx as BinaryOpContext)._right = this.expression(11); } break; @@ -1591,13 +1628,13 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 311; + this.state = 317; if (!(this.precpred(this._ctx, 9))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 9)"); } - this.state = 312; + this.state = 318; (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__46); - this.state = 313; + this.state = 319; (localctx as BinaryOpContext)._right = this.expression(10); } break; @@ -1606,13 +1643,13 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 314; + this.state = 320; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 315; + this.state = 321; (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__3); - this.state = 316; + this.state = 322; (localctx as BinaryOpContext)._right = this.expression(9); } break; @@ -1621,13 +1658,13 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 317; + this.state = 323; if (!(this.precpred(this._ctx, 7))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 7)"); } - this.state = 318; + this.state = 324; (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__47); - this.state = 319; + this.state = 325; (localctx as BinaryOpContext)._right = this.expression(8); } break; @@ -1636,13 +1673,13 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 320; + this.state = 326; if (!(this.precpred(this._ctx, 6))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 6)"); } - this.state = 321; + this.state = 327; (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__48); - this.state = 322; + this.state = 328; (localctx as BinaryOpContext)._right = this.expression(7); } break; @@ -1651,13 +1688,13 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 323; + this.state = 329; if (!(this.precpred(this._ctx, 5))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 5)"); } - this.state = 324; + this.state = 330; (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__49); - this.state = 325; + this.state = 331; (localctx as BinaryOpContext)._right = this.expression(6); } break; @@ -1665,15 +1702,15 @@ export default class CashScriptParser extends Parser { { localctx = new TupleIndexOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 326; + this.state = 332; if (!(this.precpred(this._ctx, 19))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); } - this.state = 327; + this.state = 333; this.match(CashScriptParser.T__22); - this.state = 328; + this.state = 334; (localctx as TupleIndexOpContext)._index = this.match(CashScriptParser.NumberLiteral); - this.state = 329; + this.state = 335; this.match(CashScriptParser.T__23); } break; @@ -1681,11 +1718,11 @@ export default class CashScriptParser extends Parser { { localctx = new UnaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 330; + this.state = 336; if (!(this.precpred(this._ctx, 16))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 331; + this.state = 337; (localctx as UnaryOpContext)._op = this._input.LT(1); _la = this._input.LA(1); if(!(_la===36 || _la===37)) { @@ -1702,26 +1739,26 @@ export default class CashScriptParser extends Parser { localctx = new BinaryOpContext(this, new ExpressionContext(this, _parentctx, _parentState)); (localctx as BinaryOpContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, CashScriptParser.RULE_expression); - this.state = 332; + this.state = 338; if (!(this.precpred(this._ctx, 15))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 333; + this.state = 339; (localctx as BinaryOpContext)._op = this.match(CashScriptParser.T__37); - this.state = 334; + this.state = 340; this.match(CashScriptParser.T__14); - this.state = 335; + this.state = 341; (localctx as BinaryOpContext)._right = this.expression(0); - this.state = 336; + this.state = 342; this.match(CashScriptParser.T__16); } break; } } } - this.state = 342; + this.state = 348; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 28, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 29, this._ctx); } } } @@ -1742,11 +1779,11 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public modifier(): ModifierContext { let localctx: ModifierContext = new ModifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 48, CashScriptParser.RULE_modifier); + this.enterRule(localctx, 50, CashScriptParser.RULE_modifier); try { this.enterOuterAlt(localctx, 1); { - this.state = 343; + this.state = 349; this.match(CashScriptParser.T__50); } } @@ -1767,43 +1804,43 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let localctx: LiteralContext = new LiteralContext(this, this._ctx, this.state); - this.enterRule(localctx, 50, CashScriptParser.RULE_literal); + this.enterRule(localctx, 52, CashScriptParser.RULE_literal); try { - this.state = 350; + this.state = 356; this._errHandler.sync(this); switch (this._input.LA(1)) { case 59: this.enterOuterAlt(localctx, 1); { - this.state = 345; + this.state = 351; this.match(CashScriptParser.BooleanLiteral); } break; case 61: this.enterOuterAlt(localctx, 2); { - this.state = 346; + this.state = 352; this.numberLiteral(); } break; case 64: this.enterOuterAlt(localctx, 3); { - this.state = 347; + this.state = 353; this.match(CashScriptParser.StringLiteral); } break; case 65: this.enterOuterAlt(localctx, 4); { - this.state = 348; + this.state = 354; this.match(CashScriptParser.DateLiteral); } break; case 66: this.enterOuterAlt(localctx, 5); { - this.state = 349; + this.state = 355; this.match(CashScriptParser.HexLiteral); } break; @@ -1828,18 +1865,18 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public numberLiteral(): NumberLiteralContext { let localctx: NumberLiteralContext = new NumberLiteralContext(this, this._ctx, this.state); - this.enterRule(localctx, 52, CashScriptParser.RULE_numberLiteral); + this.enterRule(localctx, 54, CashScriptParser.RULE_numberLiteral); try { this.enterOuterAlt(localctx, 1); { - this.state = 352; + this.state = 358; this.match(CashScriptParser.NumberLiteral); - this.state = 354; + this.state = 360; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { case 1: { - this.state = 353; + this.state = 359; this.match(CashScriptParser.NumberUnit); } break; @@ -1863,12 +1900,12 @@ export default class CashScriptParser extends Parser { // @RuleVersion(0) public typeName(): TypeNameContext { let localctx: TypeNameContext = new TypeNameContext(this, this._ctx, this.state); - this.enterRule(localctx, 54, CashScriptParser.RULE_typeName); + this.enterRule(localctx, 56, CashScriptParser.RULE_typeName); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 356; + this.state = 362; _la = this._input.LA(1); if(!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 1087) !== 0))) { this._errHandler.recoverInline(this); @@ -1896,7 +1933,7 @@ export default class CashScriptParser extends Parser { public sempred(localctx: RuleContext, ruleIndex: number, predIndex: number): boolean { switch (ruleIndex) { - case 23: + case 24: return this.expression_sempred(localctx as ExpressionContext, predIndex); } return true; @@ -1931,126 +1968,127 @@ export default class CashScriptParser extends Parser { return true; } - public static readonly _serializedATN: number[] = [4,1,72,359,2,0,7,0,2, + public static readonly _serializedATN: number[] = [4,1,72,365,2,0,7,0,2, 1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2, 10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17, 7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7, - 24,2,25,7,25,2,26,7,26,2,27,7,27,1,0,5,0,58,8,0,10,0,12,0,61,9,0,1,0,1, - 0,1,0,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,3,1,3,3,3,75,8,3,1,4,3,4,78,8,4,1,4, - 1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,6,5,6,89,8,6,10,6,12,6,92,9,6,1,6,1,6,1,7, - 1,7,1,7,1,7,1,7,5,7,101,8,7,10,7,12,7,104,9,7,1,7,1,7,1,8,1,8,1,8,1,8,5, - 8,112,8,8,10,8,12,8,115,9,8,1,8,3,8,118,8,8,3,8,120,8,8,1,8,1,8,1,9,1,9, - 1,9,1,10,1,10,5,10,129,8,10,10,10,12,10,132,9,10,1,10,1,10,3,10,136,8,10, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,145,8,11,1,12,1,12,5,12,149,8,12, - 10,12,12,12,152,9,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13, - 1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1, - 15,1,15,3,15,180,8,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,3,16,190, - 8,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,202,8,17,1, - 18,1,18,1,18,1,18,1,19,1,19,1,20,1,20,1,20,1,20,5,20,214,8,20,10,20,12, - 20,217,9,20,1,20,3,20,220,8,20,3,20,222,8,20,1,20,1,20,1,21,1,21,1,21,1, - 22,1,22,1,22,1,22,5,22,233,8,22,10,22,12,22,236,9,22,1,22,3,22,239,8,22, - 3,22,241,8,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,3,23,255,8,23,1,23,3,23,258,8,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,5,23,284,8,23,10,23,12,23,287,9,23,1,23,3,23,290,8,23,3,23, - 292,8,23,1,23,1,23,1,23,1,23,3,23,298,8,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,5,23,339,8,23,10,23,12,23,342,9,23,1,24,1,24,1,25,1, - 25,1,25,1,25,1,25,3,25,351,8,25,1,26,1,26,3,26,355,8,26,1,27,1,27,1,27, - 0,1,46,28,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, - 44,46,48,50,52,54,0,11,1,0,4,10,5,0,59,59,61,61,64,64,66,66,69,69,1,0,26, - 30,2,0,26,30,32,35,1,0,39,40,1,0,41,43,2,0,40,40,44,44,1,0,6,9,1,0,45,46, - 1,0,36,37,2,0,52,57,62,62,388,0,59,1,0,0,0,2,65,1,0,0,0,4,70,1,0,0,0,6, - 72,1,0,0,0,8,77,1,0,0,0,10,81,1,0,0,0,12,83,1,0,0,0,14,95,1,0,0,0,16,107, - 1,0,0,0,18,123,1,0,0,0,20,135,1,0,0,0,22,144,1,0,0,0,24,146,1,0,0,0,26, - 158,1,0,0,0,28,167,1,0,0,0,30,172,1,0,0,0,32,184,1,0,0,0,34,194,1,0,0,0, - 36,203,1,0,0,0,38,207,1,0,0,0,40,209,1,0,0,0,42,225,1,0,0,0,44,228,1,0, - 0,0,46,297,1,0,0,0,48,343,1,0,0,0,50,350,1,0,0,0,52,352,1,0,0,0,54,356, - 1,0,0,0,56,58,3,2,1,0,57,56,1,0,0,0,58,61,1,0,0,0,59,57,1,0,0,0,59,60,1, - 0,0,0,60,62,1,0,0,0,61,59,1,0,0,0,62,63,3,12,6,0,63,64,5,0,0,1,64,1,1,0, - 0,0,65,66,5,1,0,0,66,67,3,4,2,0,67,68,3,6,3,0,68,69,5,2,0,0,69,3,1,0,0, - 0,70,71,5,3,0,0,71,5,1,0,0,0,72,74,3,8,4,0,73,75,3,8,4,0,74,73,1,0,0,0, - 74,75,1,0,0,0,75,7,1,0,0,0,76,78,3,10,5,0,77,76,1,0,0,0,77,78,1,0,0,0,78, - 79,1,0,0,0,79,80,5,58,0,0,80,9,1,0,0,0,81,82,7,0,0,0,82,11,1,0,0,0,83,84, - 5,11,0,0,84,85,5,69,0,0,85,86,3,16,8,0,86,90,5,12,0,0,87,89,3,14,7,0,88, - 87,1,0,0,0,89,92,1,0,0,0,90,88,1,0,0,0,90,91,1,0,0,0,91,93,1,0,0,0,92,90, - 1,0,0,0,93,94,5,13,0,0,94,13,1,0,0,0,95,96,5,14,0,0,96,97,5,69,0,0,97,98, - 3,16,8,0,98,102,5,12,0,0,99,101,3,22,11,0,100,99,1,0,0,0,101,104,1,0,0, - 0,102,100,1,0,0,0,102,103,1,0,0,0,103,105,1,0,0,0,104,102,1,0,0,0,105,106, - 5,13,0,0,106,15,1,0,0,0,107,119,5,15,0,0,108,113,3,18,9,0,109,110,5,16, - 0,0,110,112,3,18,9,0,111,109,1,0,0,0,112,115,1,0,0,0,113,111,1,0,0,0,113, - 114,1,0,0,0,114,117,1,0,0,0,115,113,1,0,0,0,116,118,5,16,0,0,117,116,1, - 0,0,0,117,118,1,0,0,0,118,120,1,0,0,0,119,108,1,0,0,0,119,120,1,0,0,0,120, - 121,1,0,0,0,121,122,5,17,0,0,122,17,1,0,0,0,123,124,3,54,27,0,124,125,5, - 69,0,0,125,19,1,0,0,0,126,130,5,12,0,0,127,129,3,22,11,0,128,127,1,0,0, - 0,129,132,1,0,0,0,130,128,1,0,0,0,130,131,1,0,0,0,131,133,1,0,0,0,132,130, - 1,0,0,0,133,136,5,13,0,0,134,136,3,22,11,0,135,126,1,0,0,0,135,134,1,0, - 0,0,136,21,1,0,0,0,137,145,3,24,12,0,138,145,3,26,13,0,139,145,3,28,14, - 0,140,145,3,30,15,0,141,145,3,32,16,0,142,145,3,34,17,0,143,145,3,36,18, - 0,144,137,1,0,0,0,144,138,1,0,0,0,144,139,1,0,0,0,144,140,1,0,0,0,144,141, - 1,0,0,0,144,142,1,0,0,0,144,143,1,0,0,0,145,23,1,0,0,0,146,150,3,54,27, - 0,147,149,3,48,24,0,148,147,1,0,0,0,149,152,1,0,0,0,150,148,1,0,0,0,150, - 151,1,0,0,0,151,153,1,0,0,0,152,150,1,0,0,0,153,154,5,69,0,0,154,155,5, - 10,0,0,155,156,3,46,23,0,156,157,5,2,0,0,157,25,1,0,0,0,158,159,3,54,27, - 0,159,160,5,69,0,0,160,161,5,16,0,0,161,162,3,54,27,0,162,163,5,69,0,0, - 163,164,5,10,0,0,164,165,3,46,23,0,165,166,5,2,0,0,166,27,1,0,0,0,167,168, - 5,69,0,0,168,169,5,10,0,0,169,170,3,46,23,0,170,171,5,2,0,0,171,29,1,0, - 0,0,172,173,5,18,0,0,173,174,5,15,0,0,174,175,5,67,0,0,175,176,5,6,0,0, - 176,179,3,46,23,0,177,178,5,16,0,0,178,180,5,64,0,0,179,177,1,0,0,0,179, - 180,1,0,0,0,180,181,1,0,0,0,181,182,5,17,0,0,182,183,5,2,0,0,183,31,1,0, - 0,0,184,185,5,18,0,0,185,186,5,15,0,0,186,189,3,46,23,0,187,188,5,16,0, - 0,188,190,5,64,0,0,189,187,1,0,0,0,189,190,1,0,0,0,190,191,1,0,0,0,191, - 192,5,17,0,0,192,193,5,2,0,0,193,33,1,0,0,0,194,195,5,19,0,0,195,196,5, - 15,0,0,196,197,3,46,23,0,197,198,5,17,0,0,198,201,3,20,10,0,199,200,5,20, - 0,0,200,202,3,20,10,0,201,199,1,0,0,0,201,202,1,0,0,0,202,35,1,0,0,0,203, - 204,5,21,0,0,204,205,3,40,20,0,205,206,5,2,0,0,206,37,1,0,0,0,207,208,7, - 1,0,0,208,39,1,0,0,0,209,221,5,15,0,0,210,215,3,38,19,0,211,212,5,16,0, - 0,212,214,3,38,19,0,213,211,1,0,0,0,214,217,1,0,0,0,215,213,1,0,0,0,215, - 216,1,0,0,0,216,219,1,0,0,0,217,215,1,0,0,0,218,220,5,16,0,0,219,218,1, - 0,0,0,219,220,1,0,0,0,220,222,1,0,0,0,221,210,1,0,0,0,221,222,1,0,0,0,222, - 223,1,0,0,0,223,224,5,17,0,0,224,41,1,0,0,0,225,226,5,69,0,0,226,227,3, - 44,22,0,227,43,1,0,0,0,228,240,5,15,0,0,229,234,3,46,23,0,230,231,5,16, - 0,0,231,233,3,46,23,0,232,230,1,0,0,0,233,236,1,0,0,0,234,232,1,0,0,0,234, - 235,1,0,0,0,235,238,1,0,0,0,236,234,1,0,0,0,237,239,5,16,0,0,238,237,1, - 0,0,0,238,239,1,0,0,0,239,241,1,0,0,0,240,229,1,0,0,0,240,241,1,0,0,0,241, - 242,1,0,0,0,242,243,5,17,0,0,243,45,1,0,0,0,244,245,6,23,-1,0,245,246,5, - 15,0,0,246,247,3,46,23,0,247,248,5,17,0,0,248,298,1,0,0,0,249,250,3,54, - 27,0,250,251,5,15,0,0,251,254,3,46,23,0,252,253,5,16,0,0,253,255,3,46,23, - 0,254,252,1,0,0,0,254,255,1,0,0,0,255,257,1,0,0,0,256,258,5,16,0,0,257, - 256,1,0,0,0,257,258,1,0,0,0,258,259,1,0,0,0,259,260,5,17,0,0,260,298,1, - 0,0,0,261,298,3,42,21,0,262,263,5,22,0,0,263,264,5,69,0,0,264,298,3,44, - 22,0,265,266,5,25,0,0,266,267,5,23,0,0,267,268,3,46,23,0,268,269,5,24,0, - 0,269,270,7,2,0,0,270,298,1,0,0,0,271,272,5,31,0,0,272,273,5,23,0,0,273, - 274,3,46,23,0,274,275,5,24,0,0,275,276,7,3,0,0,276,298,1,0,0,0,277,278, - 7,4,0,0,278,298,3,46,23,14,279,291,5,23,0,0,280,285,3,46,23,0,281,282,5, - 16,0,0,282,284,3,46,23,0,283,281,1,0,0,0,284,287,1,0,0,0,285,283,1,0,0, - 0,285,286,1,0,0,0,286,289,1,0,0,0,287,285,1,0,0,0,288,290,5,16,0,0,289, - 288,1,0,0,0,289,290,1,0,0,0,290,292,1,0,0,0,291,280,1,0,0,0,291,292,1,0, - 0,0,292,293,1,0,0,0,293,298,5,24,0,0,294,298,5,68,0,0,295,298,5,69,0,0, - 296,298,3,50,25,0,297,244,1,0,0,0,297,249,1,0,0,0,297,261,1,0,0,0,297,262, - 1,0,0,0,297,265,1,0,0,0,297,271,1,0,0,0,297,277,1,0,0,0,297,279,1,0,0,0, - 297,294,1,0,0,0,297,295,1,0,0,0,297,296,1,0,0,0,298,340,1,0,0,0,299,300, - 10,13,0,0,300,301,7,5,0,0,301,339,3,46,23,14,302,303,10,12,0,0,303,304, - 7,6,0,0,304,339,3,46,23,13,305,306,10,11,0,0,306,307,7,7,0,0,307,339,3, - 46,23,12,308,309,10,10,0,0,309,310,7,8,0,0,310,339,3,46,23,11,311,312,10, - 9,0,0,312,313,5,47,0,0,313,339,3,46,23,10,314,315,10,8,0,0,315,316,5,4, - 0,0,316,339,3,46,23,9,317,318,10,7,0,0,318,319,5,48,0,0,319,339,3,46,23, - 8,320,321,10,6,0,0,321,322,5,49,0,0,322,339,3,46,23,7,323,324,10,5,0,0, - 324,325,5,50,0,0,325,339,3,46,23,6,326,327,10,19,0,0,327,328,5,23,0,0,328, - 329,5,61,0,0,329,339,5,24,0,0,330,331,10,16,0,0,331,339,7,9,0,0,332,333, - 10,15,0,0,333,334,5,38,0,0,334,335,5,15,0,0,335,336,3,46,23,0,336,337,5, - 17,0,0,337,339,1,0,0,0,338,299,1,0,0,0,338,302,1,0,0,0,338,305,1,0,0,0, - 338,308,1,0,0,0,338,311,1,0,0,0,338,314,1,0,0,0,338,317,1,0,0,0,338,320, - 1,0,0,0,338,323,1,0,0,0,338,326,1,0,0,0,338,330,1,0,0,0,338,332,1,0,0,0, - 339,342,1,0,0,0,340,338,1,0,0,0,340,341,1,0,0,0,341,47,1,0,0,0,342,340, - 1,0,0,0,343,344,5,51,0,0,344,49,1,0,0,0,345,351,5,59,0,0,346,351,3,52,26, - 0,347,351,5,64,0,0,348,351,5,65,0,0,349,351,5,66,0,0,350,345,1,0,0,0,350, - 346,1,0,0,0,350,347,1,0,0,0,350,348,1,0,0,0,350,349,1,0,0,0,351,51,1,0, - 0,0,352,354,5,61,0,0,353,355,5,60,0,0,354,353,1,0,0,0,354,355,1,0,0,0,355, - 53,1,0,0,0,356,357,7,10,0,0,357,55,1,0,0,0,31,59,74,77,90,102,113,117,119, - 130,135,144,150,179,189,201,215,219,221,234,238,240,254,257,285,289,291, - 297,338,340,350,354]; + 24,2,25,7,25,2,26,7,26,2,27,7,27,2,28,7,28,1,0,5,0,60,8,0,10,0,12,0,63, + 9,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,3,1,3,3,3,77,8,3,1,4,3,4, + 80,8,4,1,4,1,4,1,5,1,5,1,6,1,6,1,6,1,6,1,6,5,6,91,8,6,10,6,12,6,94,9,6, + 1,6,1,6,1,7,1,7,1,7,1,7,1,7,5,7,103,8,7,10,7,12,7,106,9,7,1,7,1,7,1,8,1, + 8,1,8,1,8,5,8,114,8,8,10,8,12,8,117,9,8,1,8,3,8,120,8,8,3,8,122,8,8,1,8, + 1,8,1,9,1,9,1,9,1,10,1,10,5,10,131,8,10,10,10,12,10,134,9,10,1,10,1,10, + 3,10,138,8,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,147,8,11,1,12,1,12, + 5,12,151,8,12,10,12,12,12,154,9,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15, + 1,15,1,15,1,15,1,15,3,15,182,8,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1, + 16,3,16,192,8,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17, + 204,8,17,1,18,1,18,1,18,1,18,1,19,1,19,1,20,1,20,3,20,214,8,20,1,21,1,21, + 1,21,1,21,5,21,220,8,21,10,21,12,21,223,9,21,1,21,3,21,226,8,21,3,21,228, + 8,21,1,21,1,21,1,22,1,22,1,22,1,23,1,23,1,23,1,23,5,23,239,8,23,10,23,12, + 23,242,9,23,1,23,3,23,245,8,23,3,23,247,8,23,1,23,1,23,1,24,1,24,1,24,1, + 24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,261,8,24,1,24,3,24,264,8,24,1,24, + 1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1, + 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,5,24,290,8,24,10,24,12,24,293, + 9,24,1,24,3,24,296,8,24,3,24,298,8,24,1,24,1,24,1,24,1,24,3,24,304,8,24, + 1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1, + 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24, + 1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,5,24,345,8,24,10,24,12, + 24,348,9,24,1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26,357,8,26,1,27,1,27, + 3,27,361,8,27,1,28,1,28,1,28,0,1,48,29,0,2,4,6,8,10,12,14,16,18,20,22,24, + 26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,0,10,1,0,4,10,1,0,26,30, + 2,0,26,30,32,35,1,0,39,40,1,0,41,43,2,0,40,40,44,44,1,0,6,9,1,0,45,46,1, + 0,36,37,2,0,52,57,62,62,394,0,61,1,0,0,0,2,67,1,0,0,0,4,72,1,0,0,0,6,74, + 1,0,0,0,8,79,1,0,0,0,10,83,1,0,0,0,12,85,1,0,0,0,14,97,1,0,0,0,16,109,1, + 0,0,0,18,125,1,0,0,0,20,137,1,0,0,0,22,146,1,0,0,0,24,148,1,0,0,0,26,160, + 1,0,0,0,28,169,1,0,0,0,30,174,1,0,0,0,32,186,1,0,0,0,34,196,1,0,0,0,36, + 205,1,0,0,0,38,209,1,0,0,0,40,213,1,0,0,0,42,215,1,0,0,0,44,231,1,0,0,0, + 46,234,1,0,0,0,48,303,1,0,0,0,50,349,1,0,0,0,52,356,1,0,0,0,54,358,1,0, + 0,0,56,362,1,0,0,0,58,60,3,2,1,0,59,58,1,0,0,0,60,63,1,0,0,0,61,59,1,0, + 0,0,61,62,1,0,0,0,62,64,1,0,0,0,63,61,1,0,0,0,64,65,3,12,6,0,65,66,5,0, + 0,1,66,1,1,0,0,0,67,68,5,1,0,0,68,69,3,4,2,0,69,70,3,6,3,0,70,71,5,2,0, + 0,71,3,1,0,0,0,72,73,5,3,0,0,73,5,1,0,0,0,74,76,3,8,4,0,75,77,3,8,4,0,76, + 75,1,0,0,0,76,77,1,0,0,0,77,7,1,0,0,0,78,80,3,10,5,0,79,78,1,0,0,0,79,80, + 1,0,0,0,80,81,1,0,0,0,81,82,5,58,0,0,82,9,1,0,0,0,83,84,7,0,0,0,84,11,1, + 0,0,0,85,86,5,11,0,0,86,87,5,69,0,0,87,88,3,16,8,0,88,92,5,12,0,0,89,91, + 3,14,7,0,90,89,1,0,0,0,91,94,1,0,0,0,92,90,1,0,0,0,92,93,1,0,0,0,93,95, + 1,0,0,0,94,92,1,0,0,0,95,96,5,13,0,0,96,13,1,0,0,0,97,98,5,14,0,0,98,99, + 5,69,0,0,99,100,3,16,8,0,100,104,5,12,0,0,101,103,3,22,11,0,102,101,1,0, + 0,0,103,106,1,0,0,0,104,102,1,0,0,0,104,105,1,0,0,0,105,107,1,0,0,0,106, + 104,1,0,0,0,107,108,5,13,0,0,108,15,1,0,0,0,109,121,5,15,0,0,110,115,3, + 18,9,0,111,112,5,16,0,0,112,114,3,18,9,0,113,111,1,0,0,0,114,117,1,0,0, + 0,115,113,1,0,0,0,115,116,1,0,0,0,116,119,1,0,0,0,117,115,1,0,0,0,118,120, + 5,16,0,0,119,118,1,0,0,0,119,120,1,0,0,0,120,122,1,0,0,0,121,110,1,0,0, + 0,121,122,1,0,0,0,122,123,1,0,0,0,123,124,5,17,0,0,124,17,1,0,0,0,125,126, + 3,56,28,0,126,127,5,69,0,0,127,19,1,0,0,0,128,132,5,12,0,0,129,131,3,22, + 11,0,130,129,1,0,0,0,131,134,1,0,0,0,132,130,1,0,0,0,132,133,1,0,0,0,133, + 135,1,0,0,0,134,132,1,0,0,0,135,138,5,13,0,0,136,138,3,22,11,0,137,128, + 1,0,0,0,137,136,1,0,0,0,138,21,1,0,0,0,139,147,3,24,12,0,140,147,3,26,13, + 0,141,147,3,28,14,0,142,147,3,30,15,0,143,147,3,32,16,0,144,147,3,34,17, + 0,145,147,3,36,18,0,146,139,1,0,0,0,146,140,1,0,0,0,146,141,1,0,0,0,146, + 142,1,0,0,0,146,143,1,0,0,0,146,144,1,0,0,0,146,145,1,0,0,0,147,23,1,0, + 0,0,148,152,3,56,28,0,149,151,3,50,25,0,150,149,1,0,0,0,151,154,1,0,0,0, + 152,150,1,0,0,0,152,153,1,0,0,0,153,155,1,0,0,0,154,152,1,0,0,0,155,156, + 5,69,0,0,156,157,5,10,0,0,157,158,3,48,24,0,158,159,5,2,0,0,159,25,1,0, + 0,0,160,161,3,56,28,0,161,162,5,69,0,0,162,163,5,16,0,0,163,164,3,56,28, + 0,164,165,5,69,0,0,165,166,5,10,0,0,166,167,3,48,24,0,167,168,5,2,0,0,168, + 27,1,0,0,0,169,170,5,69,0,0,170,171,5,10,0,0,171,172,3,48,24,0,172,173, + 5,2,0,0,173,29,1,0,0,0,174,175,5,18,0,0,175,176,5,15,0,0,176,177,5,67,0, + 0,177,178,5,6,0,0,178,181,3,48,24,0,179,180,5,16,0,0,180,182,3,38,19,0, + 181,179,1,0,0,0,181,182,1,0,0,0,182,183,1,0,0,0,183,184,5,17,0,0,184,185, + 5,2,0,0,185,31,1,0,0,0,186,187,5,18,0,0,187,188,5,15,0,0,188,191,3,48,24, + 0,189,190,5,16,0,0,190,192,3,38,19,0,191,189,1,0,0,0,191,192,1,0,0,0,192, + 193,1,0,0,0,193,194,5,17,0,0,194,195,5,2,0,0,195,33,1,0,0,0,196,197,5,19, + 0,0,197,198,5,15,0,0,198,199,3,48,24,0,199,200,5,17,0,0,200,203,3,20,10, + 0,201,202,5,20,0,0,202,204,3,20,10,0,203,201,1,0,0,0,203,204,1,0,0,0,204, + 35,1,0,0,0,205,206,5,21,0,0,206,207,3,42,21,0,207,208,5,2,0,0,208,37,1, + 0,0,0,209,210,5,64,0,0,210,39,1,0,0,0,211,214,5,69,0,0,212,214,3,52,26, + 0,213,211,1,0,0,0,213,212,1,0,0,0,214,41,1,0,0,0,215,227,5,15,0,0,216,221, + 3,40,20,0,217,218,5,16,0,0,218,220,3,40,20,0,219,217,1,0,0,0,220,223,1, + 0,0,0,221,219,1,0,0,0,221,222,1,0,0,0,222,225,1,0,0,0,223,221,1,0,0,0,224, + 226,5,16,0,0,225,224,1,0,0,0,225,226,1,0,0,0,226,228,1,0,0,0,227,216,1, + 0,0,0,227,228,1,0,0,0,228,229,1,0,0,0,229,230,5,17,0,0,230,43,1,0,0,0,231, + 232,5,69,0,0,232,233,3,46,23,0,233,45,1,0,0,0,234,246,5,15,0,0,235,240, + 3,48,24,0,236,237,5,16,0,0,237,239,3,48,24,0,238,236,1,0,0,0,239,242,1, + 0,0,0,240,238,1,0,0,0,240,241,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,243, + 245,5,16,0,0,244,243,1,0,0,0,244,245,1,0,0,0,245,247,1,0,0,0,246,235,1, + 0,0,0,246,247,1,0,0,0,247,248,1,0,0,0,248,249,5,17,0,0,249,47,1,0,0,0,250, + 251,6,24,-1,0,251,252,5,15,0,0,252,253,3,48,24,0,253,254,5,17,0,0,254,304, + 1,0,0,0,255,256,3,56,28,0,256,257,5,15,0,0,257,260,3,48,24,0,258,259,5, + 16,0,0,259,261,3,48,24,0,260,258,1,0,0,0,260,261,1,0,0,0,261,263,1,0,0, + 0,262,264,5,16,0,0,263,262,1,0,0,0,263,264,1,0,0,0,264,265,1,0,0,0,265, + 266,5,17,0,0,266,304,1,0,0,0,267,304,3,44,22,0,268,269,5,22,0,0,269,270, + 5,69,0,0,270,304,3,46,23,0,271,272,5,25,0,0,272,273,5,23,0,0,273,274,3, + 48,24,0,274,275,5,24,0,0,275,276,7,1,0,0,276,304,1,0,0,0,277,278,5,31,0, + 0,278,279,5,23,0,0,279,280,3,48,24,0,280,281,5,24,0,0,281,282,7,2,0,0,282, + 304,1,0,0,0,283,284,7,3,0,0,284,304,3,48,24,14,285,297,5,23,0,0,286,291, + 3,48,24,0,287,288,5,16,0,0,288,290,3,48,24,0,289,287,1,0,0,0,290,293,1, + 0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,295,1,0,0,0,293,291,1,0,0,0,294, + 296,5,16,0,0,295,294,1,0,0,0,295,296,1,0,0,0,296,298,1,0,0,0,297,286,1, + 0,0,0,297,298,1,0,0,0,298,299,1,0,0,0,299,304,5,24,0,0,300,304,5,68,0,0, + 301,304,5,69,0,0,302,304,3,52,26,0,303,250,1,0,0,0,303,255,1,0,0,0,303, + 267,1,0,0,0,303,268,1,0,0,0,303,271,1,0,0,0,303,277,1,0,0,0,303,283,1,0, + 0,0,303,285,1,0,0,0,303,300,1,0,0,0,303,301,1,0,0,0,303,302,1,0,0,0,304, + 346,1,0,0,0,305,306,10,13,0,0,306,307,7,4,0,0,307,345,3,48,24,14,308,309, + 10,12,0,0,309,310,7,5,0,0,310,345,3,48,24,13,311,312,10,11,0,0,312,313, + 7,6,0,0,313,345,3,48,24,12,314,315,10,10,0,0,315,316,7,7,0,0,316,345,3, + 48,24,11,317,318,10,9,0,0,318,319,5,47,0,0,319,345,3,48,24,10,320,321,10, + 8,0,0,321,322,5,4,0,0,322,345,3,48,24,9,323,324,10,7,0,0,324,325,5,48,0, + 0,325,345,3,48,24,8,326,327,10,6,0,0,327,328,5,49,0,0,328,345,3,48,24,7, + 329,330,10,5,0,0,330,331,5,50,0,0,331,345,3,48,24,6,332,333,10,19,0,0,333, + 334,5,23,0,0,334,335,5,61,0,0,335,345,5,24,0,0,336,337,10,16,0,0,337,345, + 7,8,0,0,338,339,10,15,0,0,339,340,5,38,0,0,340,341,5,15,0,0,341,342,3,48, + 24,0,342,343,5,17,0,0,343,345,1,0,0,0,344,305,1,0,0,0,344,308,1,0,0,0,344, + 311,1,0,0,0,344,314,1,0,0,0,344,317,1,0,0,0,344,320,1,0,0,0,344,323,1,0, + 0,0,344,326,1,0,0,0,344,329,1,0,0,0,344,332,1,0,0,0,344,336,1,0,0,0,344, + 338,1,0,0,0,345,348,1,0,0,0,346,344,1,0,0,0,346,347,1,0,0,0,347,49,1,0, + 0,0,348,346,1,0,0,0,349,350,5,51,0,0,350,51,1,0,0,0,351,357,5,59,0,0,352, + 357,3,54,27,0,353,357,5,64,0,0,354,357,5,65,0,0,355,357,5,66,0,0,356,351, + 1,0,0,0,356,352,1,0,0,0,356,353,1,0,0,0,356,354,1,0,0,0,356,355,1,0,0,0, + 357,53,1,0,0,0,358,360,5,61,0,0,359,361,5,60,0,0,360,359,1,0,0,0,360,361, + 1,0,0,0,361,55,1,0,0,0,362,363,7,9,0,0,363,57,1,0,0,0,32,61,76,79,92,104, + 115,119,121,132,137,146,152,181,191,203,213,221,225,227,240,244,246,260, + 263,291,295,297,303,344,346,356,360]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -2491,8 +2529,8 @@ export class TimeOpStatementContext extends ParserRuleContext { public expression(): ExpressionContext { return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - public StringLiteral(): TerminalNode { - return this.getToken(CashScriptParser.StringLiteral, 0); + public requireMessage(): RequireMessageContext { + return this.getTypedRuleContext(RequireMessageContext, 0) as RequireMessageContext; } public get ruleIndex(): number { return CashScriptParser.RULE_timeOpStatement; @@ -2516,8 +2554,8 @@ export class RequireStatementContext extends ParserRuleContext { public expression(): ExpressionContext { return this.getTypedRuleContext(ExpressionContext, 0) as ExpressionContext; } - public StringLiteral(): TerminalNode { - return this.getToken(CashScriptParser.StringLiteral, 0); + public requireMessage(): RequireMessageContext { + return this.getTypedRuleContext(RequireMessageContext, 0) as RequireMessageContext; } public get ruleIndex(): number { return CashScriptParser.RULE_requireStatement; @@ -2585,25 +2623,38 @@ export class ConsoleStatementContext extends ParserRuleContext { } -export class ConsoleParameterContext extends ParserRuleContext { +export class RequireMessageContext extends ParserRuleContext { constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); this.parser = parser; } - public Identifier(): TerminalNode { - return this.getToken(CashScriptParser.Identifier, 0); - } public StringLiteral(): TerminalNode { return this.getToken(CashScriptParser.StringLiteral, 0); } - public NumberLiteral(): TerminalNode { - return this.getToken(CashScriptParser.NumberLiteral, 0); + public get ruleIndex(): number { + return CashScriptParser.RULE_requireMessage; } - public HexLiteral(): TerminalNode { - return this.getToken(CashScriptParser.HexLiteral, 0); + // @Override + public accept(visitor: CashScriptVisitor): Result { + if (visitor.visitRequireMessage) { + return visitor.visitRequireMessage(this); + } else { + return visitor.visitChildren(this); + } } - public BooleanLiteral(): TerminalNode { - return this.getToken(CashScriptParser.BooleanLiteral, 0); +} + + +export class ConsoleParameterContext extends ParserRuleContext { + constructor(parser?: CashScriptParser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public Identifier(): TerminalNode { + return this.getToken(CashScriptParser.Identifier, 0); + } + public literal(): LiteralContext { + return this.getTypedRuleContext(LiteralContext, 0) as LiteralContext; } public get ruleIndex(): number { return CashScriptParser.RULE_consoleParameter; diff --git a/packages/cashc/src/grammar/CashScriptVisitor.ts b/packages/cashc/src/grammar/CashScriptVisitor.ts index d944d212..c8579759 100644 --- a/packages/cashc/src/grammar/CashScriptVisitor.ts +++ b/packages/cashc/src/grammar/CashScriptVisitor.ts @@ -22,6 +22,7 @@ import { TimeOpStatementContext } from "./CashScriptParser.js"; import { RequireStatementContext } from "./CashScriptParser.js"; import { IfStatementContext } from "./CashScriptParser.js"; import { ConsoleStatementContext } from "./CashScriptParser.js"; +import { RequireMessageContext } from "./CashScriptParser.js"; import { ConsoleParameterContext } from "./CashScriptParser.js"; import { ConsoleParameterListContext } from "./CashScriptParser.js"; import { FunctionCallContext } from "./CashScriptParser.js"; @@ -166,6 +167,12 @@ export default class CashScriptVisitor extends ParseTreeVisitor * @return the visitor result */ visitConsoleStatement?: (ctx: ConsoleStatementContext) => Result; + /** + * Visit a parse tree produced by `CashScriptParser.requireMessage`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRequireMessage?: (ctx: RequireMessageContext) => Result; /** * Visit a parse tree produced by `CashScriptParser.consoleParameter`. * @param ctx the parse tree diff --git a/packages/cashc/src/print/OutputSourceCodeTraversal.ts b/packages/cashc/src/print/OutputSourceCodeTraversal.ts index cc8580d1..1f33ae62 100644 --- a/packages/cashc/src/print/OutputSourceCodeTraversal.ts +++ b/packages/cashc/src/print/OutputSourceCodeTraversal.ts @@ -26,6 +26,8 @@ import { InstantiationNode, TupleAssignmentNode, NullaryOpNode, + ConsoleStatementNode, + ConsoleParameterNode, } from '../ast/AST.js'; import AstTraversal from '../ast/AstTraversal.js'; @@ -134,7 +136,13 @@ export default class OutputSourceCodeTraversal extends AstTraversal { visitRequire(node: RequireNode): Node { this.addOutput('require(', true); node.expression = this.visit(node.expression); + + if (node.message) { + this.addOutput(`, "${node.message}"`); + } + this.addOutput(');\n'); + return node; } @@ -154,6 +162,13 @@ export default class OutputSourceCodeTraversal extends AstTraversal { return node; } + visitConsoleStatement(node: ConsoleStatementNode): Node { + this.addOutput('console.log(', true); + node.parameters = this.visitCommaList(node.parameters) as ConsoleParameterNode[]; + this.addOutput(');\n'); + return node; + } + visitBlock(node: BlockNode): Node { this.addOutput('{'); this.outputSymbolTable(node.symbolTable); diff --git a/packages/cashc/src/semantic/SymbolTableTraversal.ts b/packages/cashc/src/semantic/SymbolTableTraversal.ts index 5e5fd5cc..3e7f2e92 100644 --- a/packages/cashc/src/semantic/SymbolTableTraversal.ts +++ b/packages/cashc/src/semantic/SymbolTableTraversal.ts @@ -12,7 +12,6 @@ import { InstantiationNode, AssignNode, TupleAssignmentNode, - ConsoleStatementNode, } from '../ast/AST.js'; import AstTraversal from '../ast/AstTraversal.js'; import { SymbolTable, Symbol, SymbolType } from '../ast/SymbolTable.js'; @@ -30,7 +29,6 @@ export default class SymbolTableTraversal extends AstTraversal { private functionNames: Map = new Map(); private currentFunction: FunctionDefinitionNode; private expectedSymbolType: SymbolType = SymbolType.VARIABLE; - public logSymbols: Symbol[] = []; visitContract(node: ContractNode): Node { node.symbolTable = new SymbolTable(this.symbolTables[0]); @@ -170,15 +168,4 @@ export default class SymbolTableTraversal extends AstTraversal { return node; } - - visitConsoleStatement(node: ConsoleStatementNode): ConsoleStatementNode { - // there might be same-name symbols in different code scopes - // so we collect all symbols with their location, which will be analyzed later - const symbols = node.parameters - .map((parameter) => this.symbolTables[0].get(parameter.identifier!)!) - .filter((symbol) => symbol); - - this.logSymbols.push(...symbols); - return node; - } } diff --git a/packages/cashc/test/ast/fixtures.ts b/packages/cashc/test/ast/fixtures.ts index 34d0933a..189a304a 100644 --- a/packages/cashc/test/ast/fixtures.ts +++ b/packages/cashc/test/ast/fixtures.ts @@ -25,7 +25,6 @@ import { UnaryOpNode, InstantiationNode, ConsoleStatementNode, - ConsoleParameterNode, } from '../../src/ast/AST.js'; import { BinaryOperator, NullaryOperator, UnaryOperator } from '../../src/ast/Operator.js'; import { Class, TimeOp } from '../../src/ast/Globals.js'; @@ -901,8 +900,8 @@ export const fixtures: Fixture[] = [ [new ParameterNode(PrimitiveType.INT, 'value')], new BlockNode([ new ConsoleStatementNode([ - new ConsoleParameterNode(undefined, 'value'), - new ConsoleParameterNode('test'), + new IdentifierNode('value'), + new StringLiteralNode('test', '"'), ]), new RequireNode( new BinaryOpNode( diff --git a/packages/cashc/test/compiler/UndefinedReferenceError/undefined_variable_in_console_log.cash b/packages/cashc/test/compiler/UndefinedReferenceError/undefined_variable_in_console_log.cash new file mode 100644 index 00000000..4f516124 --- /dev/null +++ b/packages/cashc/test/compiler/UndefinedReferenceError/undefined_variable_in_console_log.cash @@ -0,0 +1,5 @@ +contract Test() { + function hello() { + console.log(a, 'hello'); + } +} From 97eb9a3b9c83f5a696f740d18560b73849cb6c02 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Tue, 23 Jan 2024 09:13:31 +0100 Subject: [PATCH 016/267] Update debug_messages.cash test to be a bit more complex --- .../src/generation/GenerateTargetTraversal.ts | 1 + packages/cashc/test/ast/fixtures.ts | 22 ++++++++++++++++--- packages/cashc/test/generation/fixtures.ts | 10 ++++----- .../valid-contract-files/debug_messages.cash | 4 +++- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/packages/cashc/src/generation/GenerateTargetTraversal.ts b/packages/cashc/src/generation/GenerateTargetTraversal.ts index 3754ac2f..ea7701ac 100644 --- a/packages/cashc/src/generation/GenerateTargetTraversal.ts +++ b/packages/cashc/src/generation/GenerateTargetTraversal.ts @@ -549,6 +549,7 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // TODO: refactor to use a map instead of array (also in the artifact and other places where console logs and // require statements are used) // check if log entry exists for the instruction pointer, create if not + // TODO: Do we really want to merge different console logs at the same instruction pointer? let index = this.consoleLogs.findIndex((entry: LogEntry) => entry.ip === ip); if (index === -1) { index = this.consoleLogs.push({ ip, line, data: [] }) - 1; diff --git a/packages/cashc/test/ast/fixtures.ts b/packages/cashc/test/ast/fixtures.ts index 189a304a..20ed93b2 100644 --- a/packages/cashc/test/ast/fixtures.ts +++ b/packages/cashc/test/ast/fixtures.ts @@ -899,17 +899,33 @@ export const fixtures: Fixture[] = [ 'spend', [new ParameterNode(PrimitiveType.INT, 'value')], new BlockNode([ + new RequireNode( + new BinaryOpNode( + new IdentifierNode('value'), + BinaryOperator.EQ, + new IntLiteralNode(1n), + ), + 'Wrong value passed', + ), new ConsoleStatementNode([ new IdentifierNode('value'), new StringLiteralNode('test', '"'), ]), + new ConsoleStatementNode([ + new IdentifierNode('value'), + new StringLiteralNode('test2', '"'), + ]), new RequireNode( new BinaryOpNode( - new IdentifierNode('value'), + new BinaryOpNode( + new IdentifierNode('value'), + BinaryOperator.PLUS, + new IntLiteralNode(1n), + ), BinaryOperator.EQ, - new IntLiteralNode(1n), + new IntLiteralNode(2n), ), - 'Wrong value passed', + 'Sum doesn\'t work', ), ]), ), diff --git a/packages/cashc/test/generation/fixtures.ts b/packages/cashc/test/generation/fixtures.ts index e6d4749b..b8b2a8f7 100644 --- a/packages/cashc/test/generation/fixtures.ts +++ b/packages/cashc/test/generation/fixtures.ts @@ -649,12 +649,12 @@ export const fixtures: Fixture[] = [ abi: [ { name: 'spend', inputs: [{ name: 'value', type: 'int' }] }, ], - bytecode: 'OP_1 OP_NUMEQUAL', + bytecode: 'OP_DUP OP_1 OP_NUMEQUALVERIFY OP_1ADD OP_2 OP_NUMEQUAL', debug: { - bytecode: '007a519c', - logs: [{ data: [{ stackIndex: 0, type: 'int' }, 'test'], ip: 0, line: 3 }], - requireMessages: [{ ip: 4, line: 4, message: 'Wrong value passed' }], - sourceMap: '4:12:4:17;;:21::22;:12:::1', + bytecode: '0079519c69007a5193529c', + logs: [{ data: [{ stackIndex: 0, type: 'int' }, 'test', { stackIndex: 0, type: 'int' }, 'test2'], ip: 5, line: 4 }], + requireMessages: [{ ip: 4, line: 3, message: 'Wrong value passed' }, { ip: 11, line: 6, message: 'Sum doesn\'t work' }], + sourceMap: '3:12:3:17;;:21::22;:12:::1;:4::46;6:12:6:17:0;;:20::21;:12:::1;:25::26:0;:12:::1', }, source: fs.readFileSync(new URL('../valid-contract-files/debug_messages.cash', import.meta.url), { encoding: 'utf-8' }), compiler: { diff --git a/packages/cashc/test/valid-contract-files/debug_messages.cash b/packages/cashc/test/valid-contract-files/debug_messages.cash index fcb88c7b..92203434 100644 --- a/packages/cashc/test/valid-contract-files/debug_messages.cash +++ b/packages/cashc/test/valid-contract-files/debug_messages.cash @@ -1,6 +1,8 @@ contract DebugMessages() { function spend(int value) { - console.log(value, "test"); require(value == 1, "Wrong value passed"); + console.log(value, "test"); + console.log(value, "test2"); + require(value + 1 == 2, "Sum doesn't work"); } } From 5e7263aa127774f725b4f49feb8fe9151a5c2c21 Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Tue, 23 Jan 2024 09:19:59 +0100 Subject: [PATCH 017/267] Extract DebugInformation type for Artifact + small changes to artifact debug generation --- packages/cashc/src/artifact/Artifact.ts | 23 +++-------------------- packages/cashc/src/compiler.ts | 12 ++++++++---- packages/utils/src/artifact.ts | 14 ++++++++------ 3 files changed, 19 insertions(+), 30 deletions(-) diff --git a/packages/cashc/src/artifact/Artifact.ts b/packages/cashc/src/artifact/Artifact.ts index a5161b6f..b5e584f6 100644 --- a/packages/cashc/src/artifact/Artifact.ts +++ b/packages/cashc/src/artifact/Artifact.ts @@ -1,21 +1,10 @@ import { - Artifact, LogEntry, RequireMessage, Script, scriptToAsm, scriptToBytecode, + Artifact, DebugInformation, Script, scriptToAsm, } from '@cashscript/utils'; import { version } from '../index.js'; import { Ast } from '../ast/AST.js'; -import { binToHex } from '@bitauth/libauth'; -export function generateArtifact( - ast: Ast, - script: Script, - source: string, - debug: { - script: Script, - sourceMap: string, - logs: LogEntry[], - requireMessages: RequireMessage[], - }, -): Artifact { +export function generateArtifact(ast: Ast, script: Script, source: string, debug: DebugInformation): Artifact { const { contract } = ast; const constructorInputs = contract.parameters @@ -30,7 +19,6 @@ export function generateArtifact( })); const bytecode = scriptToAsm(script); - const debugBytecode = binToHex(scriptToBytecode(debug.script)); return { contractName: contract.name, @@ -38,12 +26,7 @@ export function generateArtifact( abi, bytecode, source, - debug: { - bytecode: debugBytecode, - sourceMap: debug.sourceMap, - logs: debug.logs, - requireMessages: debug.requireMessages, - }, + debug, compiler: { name: 'cashc', version, diff --git a/packages/cashc/src/compiler.ts b/packages/cashc/src/compiler.ts index 8d8f2192..4fad313d 100644 --- a/packages/cashc/src/compiler.ts +++ b/packages/cashc/src/compiler.ts @@ -1,5 +1,6 @@ import { CharStream, CommonTokenStream } from 'antlr4'; -import { Artifact, optimiseBytecode } from '@cashscript/utils'; +import { binToHex } from '@bitauth/libauth'; +import { Artifact, optimiseBytecode, scriptToBytecode } from '@cashscript/utils'; import fs, { PathLike } from 'fs'; import { generateArtifact } from './artifact/Artifact.js'; import { Ast } from './ast/AST.js'; @@ -28,12 +29,15 @@ export function compileString(code: string): Artifact { // Bytecode optimisation const optimisedBytecode = optimiseBytecode(traversal.output); - return generateArtifact(ast, optimisedBytecode, code, { - script: traversal.output, + // Attach debug information + const debug = { + bytecode: binToHex(scriptToBytecode(traversal.output)), sourceMap: traversal.souceMap, logs: traversal.consoleLogs, requireMessages: traversal.requireMessages, - }); + }; + + return generateArtifact(ast, optimisedBytecode, code, debug); } export function compileFile(codeFile: PathLike): Artifact { diff --git a/packages/utils/src/artifact.ts b/packages/utils/src/artifact.ts index 97ef690d..54952783 100644 --- a/packages/utils/src/artifact.ts +++ b/packages/utils/src/artifact.ts @@ -11,6 +11,13 @@ export interface AbiFunction { inputs: AbiInput[]; } +export interface DebugInformation { + bytecode: string; // unlike `bytecode` property above, this is a hex-encoded binary string + sourceMap: string; // see documentation for `generateSourceMap` + logs: LogEntry[]; // log entries generated from `console.log` statements + requireMessages: RequireMessage[]; // messages for failing `require` statements +} + export interface LogEntry { ip: number; // instruction pointer line: number; // line in the source code @@ -29,12 +36,7 @@ export interface Artifact { abi: AbiFunction[]; bytecode: string; source: string; - debug?: { - bytecode: string; // unlike `bytecode` property above, this is a hex-encoded binary string - sourceMap: string; // see documentation for `generateSourceMap` - logs: LogEntry[]; // log entries generated from `console.log` statements - requireMessages: RequireMessage[]; // messages for failing `require` statements - }; + debug?: DebugInformation; compiler: { name: string; version: string; From 51611b70209d5dca506f18cbdbe40454dd4db7ce Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Tue, 23 Jan 2024 09:26:58 +0100 Subject: [PATCH 018/267] Rename souceMap => sourceMap --- packages/cashc/src/compiler.ts | 2 +- .../cashc/src/generation/GenerateTargetTraversal.ts | 4 ++-- packages/utils/src/bitauth-script.ts | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/cashc/src/compiler.ts b/packages/cashc/src/compiler.ts index 4fad313d..adfde685 100644 --- a/packages/cashc/src/compiler.ts +++ b/packages/cashc/src/compiler.ts @@ -32,7 +32,7 @@ export function compileString(code: string): Artifact { // Attach debug information const debug = { bytecode: binToHex(scriptToBytecode(traversal.output)), - sourceMap: traversal.souceMap, + sourceMap: traversal.sourceMap, logs: traversal.consoleLogs, requireMessages: traversal.requireMessages, }; diff --git a/packages/cashc/src/generation/GenerateTargetTraversal.ts b/packages/cashc/src/generation/GenerateTargetTraversal.ts index ea7701ac..639d9b70 100644 --- a/packages/cashc/src/generation/GenerateTargetTraversal.ts +++ b/packages/cashc/src/generation/GenerateTargetTraversal.ts @@ -60,7 +60,7 @@ import { Location } from '../ast/Location.js'; export default class GenerateTargetTraversalWithLocation extends AstTraversal { private locationData: LocationData = []; // detailed location data needed for sourcemap creation - souceMap: string; + sourceMap: string; output: Script = []; stack: string[] = []; consoleLogs: LogEntry[] = []; @@ -114,7 +114,7 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // Minimally encode output by going Script -> ASM -> Script this.output = asmToScript(scriptToAsm(this.output)); - this.souceMap = generateSourceMap(this.locationData); + this.sourceMap = generateSourceMap(this.locationData); return node; } diff --git a/packages/utils/src/bitauth-script.ts b/packages/utils/src/bitauth-script.ts index a9d47b9c..f0466d4d 100644 --- a/packages/utils/src/bitauth-script.ts +++ b/packages/utils/src/bitauth-script.ts @@ -4,8 +4,8 @@ import { sourceMapToLocationData } from './source-map.js'; export type LineToOpcodesMap = Record; export type LineToAsmMap = Record; -export function buildLineToOpcodesMap(bytecode: Script, souceMap: string): LineToOpcodesMap { - const locationData = sourceMapToLocationData(souceMap); +export function buildLineToOpcodesMap(bytecode: Script, sourceMap: string): LineToOpcodesMap { + const locationData = sourceMapToLocationData(sourceMap); return locationData.reduce((lineToOpcodeMap, [location, positionHint], index) => { const opcode = bytecode[index]; @@ -18,16 +18,16 @@ export function buildLineToOpcodesMap(bytecode: Script, souceMap: string): LineT }, {}); } -export function buildLineToAsmMap(bytecode: Script, souceMap: string): LineToAsmMap { - const lineToOpcodesMap = buildLineToOpcodesMap(bytecode, souceMap); +export function buildLineToAsmMap(bytecode: Script, sourceMap: string): LineToAsmMap { + const lineToOpcodesMap = buildLineToOpcodesMap(bytecode, sourceMap); return Object.fromEntries( Object.entries(lineToOpcodesMap).map(([lineNumber, opcodeList]) => [lineNumber, scriptToBitAuthAsm(opcodeList)]), ); } -export function formatBitAuthScript(bytecode: Script, souceMap: string, sourceCode: string): string { - const lineToAsmMap = buildLineToAsmMap(bytecode, souceMap); +export function formatBitAuthScript(bytecode: Script, sourceMap: string, sourceCode: string): string { + const lineToAsmMap = buildLineToAsmMap(bytecode, sourceMap); const sourceCodeLines = sourceCode.split('\n'); From e9b0f9703bce3d7dfe3643c71663050106b2658e Mon Sep 17 00:00:00 2001 From: Rosco Kalis Date: Tue, 23 Jan 2024 10:20:34 +0100 Subject: [PATCH 019/267] Update LocationData / PositionHint types - Add enum for PositionHint - Convert LocationData type to an object (instead of tuple) - Update AST's Node class to always have a defined location - Update LocationData's usage to reflect these new types - Refactor some code in source-map.ts - Update tests and fixtures to reflect these changes --- packages/cashc/src/ast/AST.ts | 2 +- packages/cashc/src/ast/Location.ts | 4 +- .../src/generation/GenerateTargetTraversal.ts | 193 +++++++------ packages/cashc/test/ast/Location.test.ts | 10 +- packages/utils/src/bitauth-script.ts | 5 +- packages/utils/src/source-map.ts | 79 +++--- packages/utils/src/types.ts | 24 ++ .../utils/test/fixtures/source-map.fixture.ts | 266 +++++++++--------- 8 files changed, 318 insertions(+), 265 deletions(-) diff --git a/packages/cashc/src/ast/AST.ts b/packages/cashc/src/ast/AST.ts index d6acd68a..f8c7b762 100644 --- a/packages/cashc/src/ast/AST.ts +++ b/packages/cashc/src/ast/AST.ts @@ -9,7 +9,7 @@ import { binToHex } from '@bitauth/libauth'; export type Ast = SourceFileNode; export abstract class Node { - location?: Location; + location: Location; abstract accept(visitor: AstVisitor): T; } diff --git a/packages/cashc/src/ast/Location.ts b/packages/cashc/src/ast/Location.ts index ebaaf151..a3054606 100644 --- a/packages/cashc/src/ast/Location.ts +++ b/packages/cashc/src/ast/Location.ts @@ -4,7 +4,7 @@ import { LocationI } from '@cashscript/utils'; export class Location implements LocationI { constructor(public start: Point, public end: Point) {} - static fromCtx(ctx: ParserRuleContext): Location | undefined { + static fromCtx(ctx: ParserRuleContext): Location { const stop = ctx.stop?.text ? ctx.stop : ctx.start; const textLength = (stop.text ?? '').length; @@ -14,7 +14,7 @@ export class Location implements LocationI { return new Location(start, end); } - static fromToken(token: Token): Location | undefined { + static fromToken(token: Token): Location { const textLength = (token.text ?? '').length; const start = new Point(token.line, token.column); diff --git a/packages/cashc/src/generation/GenerateTargetTraversal.ts b/packages/cashc/src/generation/GenerateTargetTraversal.ts index 639d9b70..6e1f5fbc 100644 --- a/packages/cashc/src/generation/GenerateTargetTraversal.ts +++ b/packages/cashc/src/generation/GenerateTargetTraversal.ts @@ -11,10 +11,11 @@ import { Script, scriptToAsm, generateSourceMap, - LocationI, - LocationData, + FullLocationData, LogEntry, RequireMessage, + PositionHint, + SingleLocationData, } from '@cashscript/utils'; import { ContractNode, @@ -56,10 +57,9 @@ import { compileTimeOp, compileUnaryOp, } from './utils.js'; -import { Location } from '../ast/Location.js'; export default class GenerateTargetTraversalWithLocation extends AstTraversal { - private locationData: LocationData = []; // detailed location data needed for sourcemap creation + private locationData: FullLocationData = []; // detailed location data needed for sourcemap creation sourceMap: string; output: Script = []; stack: string[] = []; @@ -70,13 +70,13 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { private currentFunction: FunctionDefinitionNode; private constructorParameterCount: number; - private emit(op: OpOrData | OpOrData[], location: LocationI, positionHint?: number): void { + private emit(op: OpOrData | OpOrData[], locationData: SingleLocationData): void { if (Array.isArray(op)) { op.forEach((element) => this.output.push(element as Op)); - op.forEach(() => this.locationData.push([location, positionHint])); + op.forEach(() => this.locationData.push(locationData)); } else { this.output.push(op); - this.locationData.push([location, positionHint]); + this.locationData.push(locationData); } } @@ -127,37 +127,40 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { } else { this.pushToStack('$$', true); node.functions = node.functions.map((f, i) => { + const locationData = { location: f.location }; + const stackCopy = [...this.stack]; const selectorIndex = this.getStackIndex('$$'); - this.emit(encodeInt(BigInt(selectorIndex)), f.location!); + + this.emit(encodeInt(BigInt(selectorIndex)), locationData); if (i === node.functions.length - 1) { - this.emit(Op.OP_ROLL, f.location!); + this.emit(Op.OP_ROLL, locationData); this.removeFromStack(selectorIndex); } else { - this.emit(Op.OP_PICK, f.location!); + this.emit(Op.OP_PICK, locationData); } // All functions are if-else statements, except the final one which is // enforced with NUMEQUALVERIFY - this.emit(encodeInt(BigInt(i)), f.location!); - this.emit(Op.OP_NUMEQUAL, f.location!); + this.emit(encodeInt(BigInt(i)), locationData); + this.emit(Op.OP_NUMEQUAL, locationData); if (i < node.functions.length - 1) { - this.emit(Op.OP_IF, f.location!); + this.emit(Op.OP_IF, locationData); } else { - this.emit(Op.OP_VERIFY, f.location!); + this.emit(Op.OP_VERIFY, locationData); } f = this.visit(f) as FunctionDefinitionNode; if (i < node.functions.length - 1) { - this.emit(Op.OP_ELSE, f.location!, 1); + this.emit(Op.OP_ELSE, { ...locationData, positionHint: PositionHint.END }); } this.stack = [...stackCopy]; return f; }); for (let i = 0; i < node.functions.length - 1; i += 1) { - this.emit(Op.OP_ENDIF, node.location!, 1); + this.emit(Op.OP_ENDIF, { location: node.location, positionHint: PositionHint.END }); } } @@ -181,7 +184,7 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // "OP_VERIFY", "OP_CHECK{LOCKTIME|SEQUENCE}VERIFY OP_DROP" or "OP_ENDIF" const finalOp = this.output.pop() as Op; - const [location] = this.locationData.pop() as [Location, number?]; + const { location } = this.locationData.pop()!; // If the final op is OP_VERIFY and the stack size is less than 4 we remove it from the script // - We have the stack size check because it is more efficient to use 2DROP rather than NIP @@ -191,13 +194,13 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // we add it back to the stack this.pushToStack('(value)'); } else { - this.emit(finalOp, location!, 1); + this.emit(finalOp, { location, positionHint: PositionHint.END }); // At this point there is no verification value left on the stack: // - scoped stack is cleared inside branch ended by OP_ENDIF // - OP_CHECK{LOCKTIME|SEQUENCE}VERIFY OP_DROP does not leave a verification value // so we add OP_1 to the script (indicating success) - this.emit(Op.OP_1, node.location!, 1); + this.emit(Op.OP_1, { location: node.location, positionHint: PositionHint.END }); this.pushToStack('(value)'); } } @@ -206,7 +209,7 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // Keep final verification value, OP_NIP the other stack values const stackSize = this.stack.length; for (let i = 0; i < stackSize - 1; i += 1) { - this.emit(Op.OP_NIP, node.location!, 1); + this.emit(Op.OP_NIP, { location: node.location, positionHint: PositionHint.END }); this.nipFromStack(); } } @@ -246,30 +249,32 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // This algorithm can be optimised for hardcoded depths // See thesis for explanation emitReplace(index: number, node: Node): void { - this.emit(encodeInt(BigInt(index)), node.location!); - this.emit(Op.OP_ROLL, node.location!); - this.emit(Op.OP_DROP, node.location!); + const locationData = { location: node.location }; + + this.emit(encodeInt(BigInt(index)), locationData); + this.emit(Op.OP_ROLL, locationData); + this.emit(Op.OP_DROP, locationData); for (let i = 0; i < index - 1; i += 1) { - this.emit(Op.OP_SWAP, node.location!); + this.emit(Op.OP_SWAP, locationData); if (i < index - 2) { - this.emit(Op.OP_TOALTSTACK, node.location!); + this.emit(Op.OP_TOALTSTACK, locationData); } } for (let i = 0; i < index - 2; i += 1) { - this.emit(Op.OP_FROMALTSTACK, node.location!); + this.emit(Op.OP_FROMALTSTACK, locationData); } } visitTimeOp(node: TimeOpNode): Node { // const countBefore = this.output.length; node.expression = this.visit(node.expression); - this.emit(compileTimeOp(node.timeOp), node.location!, 1); + this.emit(compileTimeOp(node.timeOp), { location: node.location, positionHint: PositionHint.END }); // add debug require message if (node.message) { this.requireMessages.push({ ip: this.output.length + this.constructorParameterCount - 1, - line: node.location!.start.line, + line: node.location.start.line, message: node.message, }); } @@ -281,13 +286,13 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { visitRequire(node: RequireNode): Node { node.expression = this.visit(node.expression); - this.emit(Op.OP_VERIFY, node.location!, 1); + this.emit(Op.OP_VERIFY, { location: node.location, positionHint: PositionHint.END }); // add debug require message if (node.message) { this.requireMessages.push({ ip: this.output.length + this.constructorParameterCount - 1, - line: node.location!.start.line, + line: node.location.start.line, message: node.message, }); } @@ -301,20 +306,27 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { this.popFromStack(); this.scopeDepth += 1; - this.emit(Op.OP_IF, node.ifBlock.location!); + this.emit(Op.OP_IF, { location: node.ifBlock.location }); let stackDepth = this.stack.length; node.ifBlock = this.visit(node.ifBlock); this.removeScopedVariables(stackDepth, node); if (node.elseBlock) { - this.emit(Op.OP_ELSE, node.elseBlock.location!, 1); + // TODO: Why would the *start* of the else block be PositionHint.END? Is it because it is also the end of + // the if block? + this.emit(Op.OP_ELSE, { location: node.elseBlock.location, positionHint: PositionHint.END }); stackDepth = this.stack.length; node.elseBlock = this.visit(node.elseBlock); this.removeScopedVariables(stackDepth, node); } - this.emit(Op.OP_ENDIF, node.elseBlock ? node.elseBlock.location! : node.ifBlock.location!, 1); + const endLocationData = { + location: node.elseBlock ? node.elseBlock.location : node.ifBlock.location, + positionHint: PositionHint.END, + }; + + this.emit(Op.OP_ENDIF, endLocationData); this.scopeDepth -= 1; return node; @@ -323,7 +335,7 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { removeScopedVariables(depthBeforeScope: number, node: Node): void { const dropCount = this.stack.length - depthBeforeScope; for (let i = 0; i < dropCount; i += 1) { - this.emit(Op.OP_DROP, node.location!); + this.emit(Op.OP_DROP, { location: node.location }); this.popFromStack(); } } @@ -334,11 +346,14 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { // Special case for sized bytes cast, since it has another node to traverse if (node.size) { node.size = this.visit(node.size); - this.emit(Op.OP_NUM2BIN, node.location!); + this.emit(Op.OP_NUM2BIN, { location: node.location }); this.popFromStack(); } - this.emit(compileCast(node.expression.type as PrimitiveType, node.type), node.location!, 1); + this.emit( + compileCast(node.expression.type as PrimitiveType, node.type), + { location: node.location, positionHint: PositionHint.END }, + ); this.popFromStack(); this.pushToStack('(value)'); return node; @@ -351,7 +366,10 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { node.parameters = this.visitList(node.parameters); - this.emit(compileGlobalFunction(node.identifier.name as GlobalFunction), node.location!, 1); + this.emit( + compileGlobalFunction(node.identifier.name as GlobalFunction), + { location: node.location, positionHint: PositionHint.END }, + ); this.popFromStack(node.parameters.length); this.pushToStack('(value)'); @@ -359,10 +377,10 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { } visitMultiSig(node: FunctionCallNode): Node { - this.emit(encodeBool(false), node.location!); + this.emit(encodeBool(false), { location: node.location }); this.pushToStack('(value)'); node.parameters = this.visitList(node.parameters); - this.emit(Op.OP_CHECKMULTISIG, node.location!, 1); + this.emit(Op.OP_CHECKMULTISIG, { location: node.location, positionHint: PositionHint.END }); const sigs = node.parameters[0] as ArrayNode; const pks = node.parameters[1] as ArrayNode; this.popFromStack(sigs.elements.length + pks.elements.length + 3); @@ -372,72 +390,75 @@ export default class GenerateTargetTraversalWithLocation extends AstTraversal { } visitInstantiation(node: InstantiationNode): Node { + const nodeLocationData = { location: node.location }; + if (node.identifier.name === Class.LOCKING_BYTECODE_P2PKH) { // OP_DUP OP_HASH160 OP_PUSH<20> - this.emit(hexToBin('76a914'), node.location!); + this.emit(hexToBin('76a914'), nodeLocationData); this.pushToStack('(value)'); // this.visit(node.parameters[0]); - this.emit(Op.OP_CAT, node.location!); + this.emit(Op.OP_CAT, nodeLocationData); // OP_EQUAL OP_CHECKSIG - this.emit(hexToBin('88ac'), node.location!); - this.emit(Op.OP_CAT, node.location!); + this.emit(hexToBin('88ac'), nodeLocationData); + this.emit(Op.OP_CAT, nodeLocationData); this.popFromStack(2); } else if (node.identifier.name === Class.LOCKING_BYTECODE_P2SH20) { // OP_HASH160 OP_PUSH<20> - this.emit(hexToBin('a914'), node.location!); + this.emit(hexToBin('a914'), nodeLocationData); this.pushToStack('(value)'); //