From 4543ea4eb05e40fe4a35b0695dc73d21eb8b72b3 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 12:35:43 -0400 Subject: [PATCH 01/17] Add fixes from previous code review These changes address the comments from https://github.com/informalsystems/quint/pull/1088 I had fixed all of these, but then merged the PR without pushing my fixes. --- quint/src/IRprinting.ts | 6 +-- quint/src/graphics.ts | 2 +- quint/src/parsing/ToIrListener.ts | 2 +- quint/test/IRprinting.test.ts | 2 +- .../test/parsing/quintParserFrontend.test.ts | 41 +++++++++++-------- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/quint/src/IRprinting.ts b/quint/src/IRprinting.ts index d63d6e6a0..80af3405d 100644 --- a/quint/src/IRprinting.ts +++ b/quint/src/IRprinting.ts @@ -195,12 +195,12 @@ export function sumToString(s: QuintSumType): string { return s.fields.fields .map((f: RowField) => { if (isTheUnit(f.fieldType)) { - return `| ${f.fieldName}` + return `${f.fieldName}` } else { - return `| ${f.fieldName}(${typeToString(f.fieldType)})` + return `${f.fieldName}(${typeToString(f.fieldType)})` } }) - .join('\n') + .join(' | ') } /** diff --git a/quint/src/graphics.ts b/quint/src/graphics.ts index 7d1620239..e3a1f72d3 100644 --- a/quint/src/graphics.ts +++ b/quint/src/graphics.ts @@ -186,7 +186,7 @@ export function prettyQuintType(type: QuintType): Doc { return group([text('{ '), prettyRow(type.fields), text('}')]) } case 'sum': { - return group([text('{ '), prettySumRow(type.fields), text('}')]) + return prettySumRow(type.fields) } case 'union': { const records = type.records.map(rec => { diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 6f5961714..388952343 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -400,7 +400,7 @@ export class ToIrListener implements QuintListener { // Check if we have an accompanying type, and if not, then synthesize the // unit type. // - // I.e., we interpert a variant `A` as `A({})`. + // I.e., we interpret a variant `A` as `A({})`. if (poppedType === undefined) { const id = this.idGen.nextId() this.sourceMap.set(id, this.loc(ctx)) diff --git a/quint/test/IRprinting.test.ts b/quint/test/IRprinting.test.ts index 4013ad7e9..5d88690a6 100644 --- a/quint/test/IRprinting.test.ts +++ b/quint/test/IRprinting.test.ts @@ -232,7 +232,7 @@ describe('typeToString', () => { other: { kind: 'empty' }, }, } - const expectedType = '| A(int)\n| B' + const expectedType = 'A(int) | B' assert.deepEqual(typeToString(type), expectedType) }) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 3dc443781..16f838bbd 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -131,24 +131,31 @@ describe('parsing', () => { }) it('parses sum types', () => { - const mod = ` - module SumTypes { - type T = - | A - | B(int) + const sumTypeIrIsFormedCorrectly: (mod: string) => void = mod => { + const result = parsePhase1fromText(newIdGenerator(), mod, 'test') + assert(result.isRight()) + const typeDef = result.value.modules[0].defs[0] + assert(typeDef.kind === 'typedef') + const sumType = typeDef.type! + assert(sumType.kind === 'sum') + const [variantA, variantB] = sumType.fields.fields + assert(variantA.fieldName === 'A') + assert(isTheUnit(variantA.fieldType)) + assert(variantB.fieldName === 'B') + assert(variantB.fieldType.kind === 'int') } - ` - const result = parsePhase1fromText(newIdGenerator(), mod, 'test') - assert(result.isRight()) - const typeDef = result.value.modules[0].defs[0] - assert(typeDef.kind === 'typedef') - const sumType = typeDef.type! - assert(sumType.kind === 'sum') - const [variantA, variantB] = sumType.fields.fields - assert(variantA.fieldName === 'A') - assert(isTheUnit(variantA.fieldType)) - assert(variantB.fieldName === 'B') - assert(variantB.fieldType.kind === 'int') + sumTypeIrIsFormedCorrectly(` + module SumTypes { + type T = + | A + | B(int) + } + `) + sumTypeIrIsFormedCorrectly(` + module SumTypes { + type T = A | B(int) + } + `) }) }) From 600c5a280517ebf1ccf436ba33c8128270150bce Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 00:58:44 -0400 Subject: [PATCH 02/17] Add parser for sum type eliminator --- quint/src/IRTransformer.ts | 35 +++++ quint/src/IRVisitor.ts | 19 +++ quint/src/IRprinting.ts | 21 ++- quint/src/flattening.ts | 36 +++++- quint/src/generated/Quint.g4 | 9 +- quint/src/parsing/ToIrListener.ts | 122 +++++++++++++++--- quint/src/quintIr.ts | 35 ++++- quint/src/quintTypes.ts | 4 +- quint/test/IRprinting.test.ts | 4 +- .../test/parsing/quintParserFrontend.test.ts | 84 +++++++++--- 10 files changed, 316 insertions(+), 53 deletions(-) diff --git a/quint/src/IRTransformer.ts b/quint/src/IRTransformer.ts index 19e7c04ad..376c69d24 100644 --- a/quint/src/IRTransformer.ts +++ b/quint/src/IRTransformer.ts @@ -58,6 +58,10 @@ export class IRTransformer { exitLambda?: (expr: ir.QuintLambda) => ir.QuintLambda enterLet?: (expr: ir.QuintLet) => ir.QuintLet exitLet?: (expr: ir.QuintLet) => ir.QuintLet + enterMatch?: (expr: ir.QuintMatch) => ir.QuintMatch + exitMatch?: (expr: ir.QuintMatch) => ir.QuintMatch + enterVariant?: (expr: ir.QuintVariant) => ir.QuintVariant + exitVariant?: (expr: ir.QuintVariant) => ir.QuintVariant /** Types */ enterLiteralType?: ( @@ -448,6 +452,37 @@ function transformExpression(transformer: IRTransformer, expr: ir.QuintEx): ir.Q } } break + case 'match': + { + if (transformer.enterMatch) { + newExpr = transformer.enterMatch(newExpr) + } + + newExpr.expr = transformExpression(transformer, newExpr.expr) + newExpr.cases = newExpr.cases.map(matchCase => ({ + ...matchCase, + expr: transformExpression(transformer, matchCase.elim), + })) + + if (transformer.exitMatch) { + newExpr = transformer.exitMatch(newExpr) + } + } + break + + case 'variant': + { + if (transformer.enterVariant) { + newExpr = transformer.enterVariant(newExpr) + } + + newExpr.expr = transformExpression(transformer, newExpr) + + if (transformer.exitVariant) { + newExpr = transformer.exitVariant(newExpr) + } + } + break default: unreachable(newExpr) diff --git a/quint/src/IRVisitor.ts b/quint/src/IRVisitor.ts index 5938cc554..65015d547 100644 --- a/quint/src/IRVisitor.ts +++ b/quint/src/IRVisitor.ts @@ -62,6 +62,10 @@ export interface IRVisitor { exitLambda?: (_expr: ir.QuintLambda) => void enterLet?: (_expr: ir.QuintLet) => void exitLet?: (_expr: ir.QuintLet) => void + enterMatch?: (_expr: ir.QuintMatch) => void + exitMatch?: (_expr: ir.QuintMatch) => void + enterVariant?: (_expr: ir.QuintVariant) => void + exitVariant?: (_expr: ir.QuintVariant) => void /** Types */ enterLiteralType?: (_type: t.QuintBoolType | t.QuintIntType | t.QuintStrType) => void @@ -248,6 +252,9 @@ export function walkType(visitor: IRVisitor, type: t.QuintType): void { case 'sum': visitor.enterSumType?.(type) + + walkRow(visitor, type.fields) + visitor.exitSumType?.(type) break @@ -301,6 +308,7 @@ export function walkDefinition(visitor: IRVisitor, def: ir.QuintDef): void { if (visitor.enterTypeDef) { visitor.enterTypeDef(def) } + if (visitor.exitTypeDef) { visitor.exitTypeDef(def) } @@ -404,6 +412,17 @@ function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { visitor.exitLet(expr) } break + case 'match': + visitor.enterMatch?.(expr) + visitor.exitMatch?.(expr) + break + case 'variant': + visitor.enterVariant?.(expr) + if (expr.expr) { + walkExpression(visitor, expr.expr) + } + visitor.exitVariant?.(expr) + break default: unreachable(expr) } diff --git a/quint/src/IRprinting.ts b/quint/src/IRprinting.ts index 80af3405d..eba3cf0d4 100644 --- a/quint/src/IRprinting.ts +++ b/quint/src/IRprinting.ts @@ -12,8 +12,8 @@ * @module */ -import { OpQualifier, QuintDef, QuintEx, QuintModule, isAnnotatedDef } from './quintIr' -import { EmptyRow, QuintSumType, QuintType, Row, RowField, VarRow, isTheUnit } from './quintTypes' +import { OpQualifier, QuintDef, QuintEx, QuintModule, isAnnotatedDef, MatchCase } from './quintIr' +import { EmptyRow, QuintSumType, QuintType, Row, RowField, VarRow, isUnitType } from './quintTypes' import { TypeScheme } from './types/base' import { typeSchemeToString } from './types/printing' @@ -126,9 +126,24 @@ export function expressionToString(expr: QuintEx): string { return `((${expr.params.map(p => p.name).join(', ')}) => ${expressionToString(expr.expr)})` case 'let': return `${definitionToString(expr.opdef)} { ${expressionToString(expr.expr)} }` + case 'variant': { + const param = expr.expr ? `(${expressionToString(expr.expr)})` : '' + return `${expr.label}${param}` + } + case 'match': + return `match ${expressionToString(expr.expr)} { ${matchCasesToString(expr.cases)} }` } } +function matchCasesToString(cases: MatchCase[]): string { + return cases + .map(({ label, elim }) => { + const param = elim.params.length === 0 ? '' : `(${elim.params[0].name})` + return `${label}${param} => ${expressionToString(elim.expr)}` + }) + .join(' | ') +} + /** * Pretty prints a type * @@ -194,7 +209,7 @@ export function rowToString(r: Row): string { export function sumToString(s: QuintSumType): string { return s.fields.fields .map((f: RowField) => { - if (isTheUnit(f.fieldType)) { + if (isUnitType(f.fieldType)) { return `${f.fieldName}` } else { return `${f.fieldName}(${typeToString(f.fieldType)})` diff --git a/quint/src/flattening.ts b/quint/src/flattening.ts index ce4e22202..7b4baf73f 100644 --- a/quint/src/flattening.ts +++ b/quint/src/flattening.ts @@ -26,6 +26,7 @@ import { QuintOpDef, isAnnotatedDef, isFlat, + QuintLambda, } from './quintIr' import { definitionToString } from './IRprinting' import { ConcreteFixedRow, QuintType, Row } from './quintTypes' @@ -343,23 +344,46 @@ class Flatenner { } } case 'lambda': + return this.addNamespaceToLambda(id, name, expr) + case 'let': return { ...expr, - params: expr.params.map(param => ({ - name: this.namespacedName(name, param.name), - id: this.getNewIdWithSameData(param.id), - })), + opdef: this.addNamespaceToOpDef(name, expr.opdef), expr: this.addNamespaceToExpr(name, expr.expr), id, } - case 'let': + case 'match': return { ...expr, - opdef: this.addNamespaceToOpDef(name, expr.opdef), expr: this.addNamespaceToExpr(name, expr.expr), + cases: expr.cases.map(({ label, elim }) => ({ + label: this.namespacedName(name, label), + elim: this.addNamespaceToLambda(this.getNewIdWithSameData(elim.id), name, elim), + })), id, } + + case 'variant': + return { + ...expr, + label: this.namespacedName(name, expr.label), + expr: expr.expr ? this.addNamespaceToExpr(name, expr.expr) : expr.expr, + } + } + } + + // Gives us a more narrowly typed transformation on lambdsas, so we can use the same functionality for + // match exprssions. + private addNamespaceToLambda(id: bigint, name: string | undefined, lam: QuintLambda): QuintLambda { + return { + ...lam, + params: lam.params.map(param => ({ + name: this.namespacedName(name, param.name), + id: this.getNewIdWithSameData(param.id), + })), + expr: this.addNamespaceToExpr(name, lam.expr), + id, } } diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index ed4eceb9c..8a307a014 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -57,7 +57,7 @@ typeDef | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef ; -// A single variant case in a sum type definition. +// A single variant case in a sum type definition or match statement. // // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; @@ -157,6 +157,7 @@ expr: // apply a built-in operator via the dot notation | expr OR expr # or | expr IFF expr # iff | expr IMPLIES expr # implies + | matchSumExpr # matchSum | expr MATCH ('|' STRING ':' parameter '=>' expr)+ # match | 'all' '{' expr (',' expr)* ','? '}' # actionAll @@ -176,6 +177,12 @@ expr: // apply a built-in operator via the dot notation | '{' expr '}' # braces ; +// match e { A(a) => e1 | B => e2 | C(_)} +matchSumExpr: MATCH expr '{' '|'? matchCase+=matchSumCase ('|' matchCase+=matchSumCase)* '}' ; +matchSumCase: (variantMatch=matchSumVariant | wildCardMatch='_') '=>' expr ; +matchSumVariant + : (variantLabel=simpleId["variant label"]) ('(' variantVar=simpleId["match case variable"] | variantHole='_' ')')? ; + // A probing rule for REPL. // Note that a top-level declaration has priority over an expression. // For example, see: https://github.com/informalsystems/quint/issues/394 diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 388952343..cada165ec 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -3,22 +3,28 @@ import { IdGenerator } from '../idGenerator' import { ParserRuleContext } from 'antlr4ts/ParserRuleContext' import { QuintListener } from '../generated/QuintListener' import { + MatchCase, OpQualifier, QuintApp, + QuintBuiltinApp, QuintDef, QuintEx, + QuintLambda, QuintLambdaParameter, + QuintMatch, QuintModule, QuintName, QuintOpDef, + QuintVariant, } from '../quintIr' -import { ConcreteFixedRow, QuintSumType, QuintType, Row, RowField, unitValue } from '../quintTypes' +import { ConcreteFixedRow, QuintSumType, QuintType, Row, RowField, isUnitType, unitType } from '../quintTypes' import { strict as assert } from 'assert' import { ErrorMessage, Loc } from './quintParserFrontend' import { compact, zipWith } from 'lodash' import { Maybe, just, none } from '@sweet-monads/maybe' import { TerminalNode } from 'antlr4ts/tree/TerminalNode' import { QuintTypeDef } from '../quintIr' +import { zip } from '../../test/util' /** * An ANTLR4 listener that constructs QuintIr objects out of the abstract @@ -371,43 +377,65 @@ export class ToIrListener implements QuintListener { // type T = | A | B(t1) | C(t2) exitTypeSumDef(ctx: p.TypeSumDefContext) { const name = ctx._typeName!.text! - const defId = this.idGen.nextId() - this.sourceMap.set(defId, this.loc(ctx)) - - const typeId = this.idGen.nextId() - this.sourceMap.set(typeId, this.loc(ctx)) + const id = this.getId(ctx) + // Build the type declaraion const fields: RowField[] = popMany(this.variantStack, this.variantStack.length) const row: ConcreteFixedRow = { kind: 'row', fields, other: { kind: 'empty' } } - const type: QuintSumType = { id: defId, kind: 'sum', fields: row } - + const type: QuintSumType = { id, kind: 'sum', fields: row } const def: QuintTypeDef = { - id: defId, + id: id, name, kind: 'typedef', type, } - this.definitionStack.push(def) + // Generate all the variant constructors + // a variant constructor is an operator that injects an exprssion + // into the sum type by wrapping it in a label + const constructors: QuintOpDef[] = zip(fields, ctx.typeSumVariant()).map( + ([{ fieldName, fieldType }, variantCtx]) => { + // Mangle the parameter name to avoid clashes + // This shouldn't be visible to users + const paramName = `__${fieldName}Param` + + let params: QuintLambdaParameter[] + let expr: QuintEx + let qualifier: OpQualifier + + if (isUnitType(fieldType)) { + // The nullary variant constructor is actual + // variant pairint a label with the unit. + params = [] + expr = unitValue(this.getId(variantCtx._sumLabel)) + // Its a `val` cause it takes no arguments + qualifier = 'val' + } else { + // Oherwise we will build constructor that takes one parameter + // and wraps it in a `variaint` + params = [{ id: this.getId(variantCtx.type()!), name: paramName }] + expr = { kind: 'name', name: paramName, id: this.getId(variantCtx._sumLabel) } + qualifier = 'def' + } + + const variant: QuintVariant = { id: this.getId(variantCtx), kind: 'variant', label: fieldName, expr } + const lam: QuintLambda = { id: this.getId(variantCtx), kind: 'lambda', params, qualifier, expr: variant } + return { id: this.getId(variantCtx), kind: 'def', name: fieldName, qualifier, expr: lam } + } + ) + + this.definitionStack.push(def, ...constructors) } exitTypeSumVariant(ctx: p.TypeSumVariantContext) { const fieldName = ctx._sumLabel!.text! const poppedType = this.popType().value - let fieldType: QuintType - // Check if we have an accompanying type, and if not, then synthesize the // unit type. // // I.e., we interpret a variant `A` as `A({})`. - if (poppedType === undefined) { - const id = this.idGen.nextId() - this.sourceMap.set(id, this.loc(ctx)) - fieldType = unitValue(id) - } else { - fieldType = poppedType - } + const fieldType: QuintType = poppedType ? poppedType : unitType(this.getId(ctx)) this.variantStack.push({ fieldName, fieldType }) } @@ -859,11 +887,55 @@ export class ToIrListener implements QuintListener { } // if (p) e1 else e2 - exitIfElse(ctx: any) { + exitIfElse(ctx: p.IfElseContext) { const args = popMany(this.exprStack, 3) this.pushApplication(ctx, 'ite', args) } + // match expr { + // | Variant1(var1) => expr1 + // | Variantk(_) => exprk // a hole in the payload + // | ... + // | Variantn(varn) => exprn + // | _ => exprm // A wildcard match, acting as a catchall + // } + exitMatchSumExpr(ctx: p.MatchSumExprContext) { + const matchId = this.getId(ctx) + // We will have one expression for each match case, plus the + const exprs = popMany(this.exprStack, ctx._matchCase.length + 1) + // The first expression is the one we are matching on + // the syntax rules ensure that at least this expression is given + const expr = exprs.shift()! + // after shifting off the match expr, the remaing exprs are in eache case + const cases: MatchCase[] = zip(exprs, ctx._matchCase).map(([caseExpr, caseCtx]) => { + const caseId = this.getId(caseCtx) + let label: string + let params: QuintLambdaParameter[] + if (caseCtx._wildCardMatch) { + // a wildcard case: _ => expr + label = '_' + params = [] + } else if (caseCtx._variantMatch) { + const variant = caseCtx._variantMatch + let name: string + if (variant._variantParam) { + name = variant._variantParam.text + } else { + // We either have a hole or no param specified, in which case our lambda only needs a hole + name = '_' + } + label = variant._variantLabel.text + params = [{ name, id: this.getId(variant) }] + } else { + throw new Error('impossible: either _wildCardMatch or _variantMatch must be present') + } + const elim: QuintLambda = { id: caseId, kind: 'lambda', qualifier: 'def', expr: caseExpr, params } + return { label, elim } + }) + const matchExpr: QuintMatch = { id: matchId, kind: 'match', expr, cases } + this.exprStack.push(matchExpr) + } + // entry match // | "Cat": cat => cat.name != "" // | "Dog": dog => dog.year > 0 @@ -1173,3 +1245,13 @@ function popMany(stack: T[], n: number): T[] { function getDocText(doc: TerminalNode[]): string { return doc.map(l => l.text.slice(4, -1)).join('\n') } + +// Helper to construct an empty record (the unit value) +function unitValue(id: bigint): QuintBuiltinApp { + return { + id, + kind: 'app', + opcode: 'Rec', + args: [], + } +} diff --git a/quint/src/quintIr.ts b/quint/src/quintIr.ts index 608c8e0a0..85722f018 100644 --- a/quint/src/quintIr.ts +++ b/quint/src/quintIr.ts @@ -251,7 +251,16 @@ export interface QuintLet extends WithId { /** * Discriminated union of Quint expressions. */ -export type QuintEx = QuintName | QuintBool | QuintInt | QuintStr | QuintApp | QuintLambda | QuintLet +export type QuintEx = + | QuintName + | QuintBool + | QuintInt + | QuintStr + | QuintApp + | QuintLambda + | QuintLet + | QuintMatch + | QuintVariant /** * A user-defined operator that is defined via one of the qualifiers: @@ -294,6 +303,30 @@ export interface QuintAssume extends WithId { assumption: QuintEx } +export type MatchCase = { + /** the variant label to match */ + label: string + /** the lamba to apply to the variant's wrapped value */ + elim: QuintLambda +} + +export interface QuintMatch extends WithId { + kind: 'match' + /** the variant expression to match */ + expr: QuintEx + /** the cases to match against */ + cases: MatchCase[] +} + +/** A variant value inhabiting a sum type */ +export interface QuintVariant extends WithId { + kind: 'variant' + /** the varian't tag, e.g., the `A` in `A(n)` */ + label: string + /** the expression injected into the sum type */ + expr?: QuintEx +} + /** QuintTypeDefs represent both type aliases and abstract types * * - Abstract types do not have an associated `type` diff --git a/quint/src/quintTypes.ts b/quint/src/quintTypes.ts index 065a41446..2a08553e4 100644 --- a/quint/src/quintTypes.ts +++ b/quint/src/quintTypes.ts @@ -75,7 +75,7 @@ export interface QuintRecordType extends WithOptionalId { } // A value of the unit type, i.e. an empty record -export function unitValue(id: bigint): QuintRecordType { +export function unitType(id: bigint): QuintRecordType { return { id, kind: 'rec', @@ -83,7 +83,7 @@ export function unitValue(id: bigint): QuintRecordType { } } -export function isTheUnit(r: QuintType): Boolean { +export function isUnitType(r: QuintType): Boolean { return r.kind === 'rec' && r.fields.kind === 'row' && r.fields.fields.length === 0 && r.fields.other.kind === 'empty' } diff --git a/quint/test/IRprinting.test.ts b/quint/test/IRprinting.test.ts index 5d88690a6..c23375c7e 100644 --- a/quint/test/IRprinting.test.ts +++ b/quint/test/IRprinting.test.ts @@ -3,7 +3,7 @@ import { assert } from 'chai' import { buildDef, buildExpression, buildModuleWithDefs, buildType } from './builders/ir' import { definitionToString, expressionToString, moduleToString, typeToString } from '../src/IRprinting' import { toScheme } from '../src/types/base' -import { QuintSumType, unitValue } from '../src' +import { QuintSumType, unitType } from '../src' describe('moduleToString', () => { const quintModule = buildModuleWithDefs(['var S: Set[int]', 'val f = S.filter(x => x + 1)']) @@ -227,7 +227,7 @@ describe('typeToString', () => { kind: 'row', fields: [ { fieldName: 'A', fieldType: { kind: 'int', id: 0n } }, - { fieldName: 'B', fieldType: unitValue(0n) }, + { fieldName: 'B', fieldType: unitType(0n) }, ], other: { kind: 'empty' }, }, diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 16f838bbd..965db20ae 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -15,7 +15,7 @@ import { right } from '@sweet-monads/either' import { newIdGenerator } from '../../src/idGenerator' import { collectIds } from '../util' import { fileSourceResolver } from '../../src/parsing/sourceResolver' -import { isTheUnit } from '../../src' +import { errorTreeToString, isUnitType, moduleToString } from '../../src' // read a Quint file from the test data directory function readQuint(name: string): string { @@ -131,31 +131,79 @@ describe('parsing', () => { }) it('parses sum types', () => { - const sumTypeIrIsFormedCorrectly: (mod: string) => void = mod => { + parseAndCompare('_1043sumTypeDecl') + // const sumTypeIrIsFormedCorrectly: (mod: string) => void = mod => { + // const result = parsePhase1fromText(newIdGenerator(), mod, 'test') + // assert(result.isRight()) + // const [typeDef, constructorA, constructorB] = result.value.modules[0].defs + + // // Check the type + // assert(typeDef.kind === 'typedef') + // const sumType = typeDef.type! + // assert(sumType.kind === 'sum') + + // const [variantA, variantB] = sumType.fields.fields + // assert(variantA.fieldName === 'A') + // assert(isUnitType(variantA.fieldType)) + // assert(variantB.fieldName === 'B') + // assert(variantB.fieldType.kind === 'int') + + // // Check the generated constructors + // assert(constructorA.kind === 'def') + // assert(constructorA.name === 'A') + // assert(constructorA.qualifier === 'val') + // const lamA = constructorA.expr + // assert(lamA.kind === 'lambda') + // assert.deepEqual(lamA.params, []) + // assert(lamA.expr === undefined) + // } + // sumTypeIrIsFormedCorrectly(` + // module SumTypes { + // type T = + // | A + // | B(int) + // } + // `) + // sumTypeIrIsFormedCorrectly(` + // module SumTypes { + // type T = A | B(int) + // } + // `) + }) + + it('parses match expressions', () => { + const parseToString: (mod: string) => string = mod => { const result = parsePhase1fromText(newIdGenerator(), mod, 'test') - assert(result.isRight()) - const typeDef = result.value.modules[0].defs[0] - assert(typeDef.kind === 'typedef') - const sumType = typeDef.type! - assert(sumType.kind === 'sum') - const [variantA, variantB] = sumType.fields.fields - assert(variantA.fieldName === 'A') - assert(isTheUnit(variantA.fieldType)) - assert(variantB.fieldName === 'B') - assert(variantB.fieldType.kind === 'int') + assert(result.isRight(), result.isLeft() ? result.value.map(err => err.explanation).join('\n') : 'impossible') + return moduleToString(result.value.modules[0]) } - sumTypeIrIsFormedCorrectly(` + const multiLine = parseToString(` module SumTypes { - type T = - | A - | B(int) + val ex = match foo { + | A => 0 + | B(n) => n + | _ => -1 + } } `) - sumTypeIrIsFormedCorrectly(` + assert.deepEqual( + multiLine, + `module SumTypes { + val ex = match foo { A(_) => 0 | B(n) => n | _ => iuminus(1) } +}` + ) + + const singleLine = parseToString(` module SumTypes { - type T = A | B(int) + val ex = match foo { A => 0 | B(n) => n | _ => -1 } } `) + assert.deepEqual( + singleLine, + `module SumTypes { + val ex = match foo { A(_) => 0 | B(n) => n | _ => iuminus(1) } +}` + ) }) }) From 79811af28c7290a2965b82ab8bbe5a0a10e0bf15 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 12:26:17 -0400 Subject: [PATCH 03/17] Add generated parser --- quint/src/generated/Quint.g4 | 2 +- quint/src/generated/Quint.interp | 5 +- quint/src/generated/QuintListener.ts | 50 + quint/src/generated/QuintParser.ts | 2237 ++++++++++------- quint/src/generated/QuintVisitor.ts | 33 + quint/testFixture/_1025importeeWithError.json | 2 +- 6 files changed, 1384 insertions(+), 945 deletions(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 8a307a014..2fbdd6a67 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -181,7 +181,7 @@ expr: // apply a built-in operator via the dot notation matchSumExpr: MATCH expr '{' '|'? matchCase+=matchSumCase ('|' matchCase+=matchSumCase)* '}' ; matchSumCase: (variantMatch=matchSumVariant | wildCardMatch='_') '=>' expr ; matchSumVariant - : (variantLabel=simpleId["variant label"]) ('(' variantVar=simpleId["match case variable"] | variantHole='_' ')')? ; + : (variantLabel=simpleId["variant label"]) ('(' (variantParam=simpleId["match case parameter"] | '_') ')')? ; // A probing rule for REPL. // Note that a top-level declaration has priority over an expression. diff --git a/quint/src/generated/Quint.interp b/quint/src/generated/Quint.interp index 9ded23535..33f2b4fb4 100644 --- a/quint/src/generated/Quint.interp +++ b/quint/src/generated/Quint.interp @@ -164,6 +164,9 @@ typeUnionRecOne row rowLabel expr +matchSumExpr +matchSumCase +matchSumVariant unitOrExpr lambda identOrHole @@ -180,4 +183,4 @@ simpleId atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 726, 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, 3, 2, 6, 2, 72, 10, 2, 13, 2, 14, 2, 73, 3, 2, 3, 2, 3, 3, 7, 3, 79, 10, 3, 12, 3, 14, 3, 82, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 88, 10, 3, 12, 3, 14, 3, 91, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 96, 10, 4, 12, 4, 14, 4, 99, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 123, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 131, 10, 6, 12, 6, 14, 6, 134, 11, 6, 5, 6, 136, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 141, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 154, 10, 6, 12, 6, 14, 6, 157, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 163, 10, 6, 3, 6, 3, 6, 5, 6, 167, 10, 6, 3, 6, 5, 6, 170, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 183, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 188, 10, 7, 12, 7, 14, 7, 191, 11, 7, 5, 7, 193, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 200, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 206, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 211, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 222, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 230, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 236, 10, 11, 3, 11, 3, 11, 5, 11, 240, 10, 11, 5, 11, 242, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 253, 10, 12, 5, 12, 255, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 268, 10, 13, 12, 13, 14, 13, 271, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 278, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 291, 10, 13, 12, 13, 14, 13, 294, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 301, 10, 13, 5, 13, 303, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 318, 10, 18, 12, 18, 14, 18, 321, 11, 18, 5, 18, 323, 10, 18, 3, 18, 5, 18, 326, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 347, 10, 18, 12, 18, 14, 18, 350, 11, 18, 3, 18, 5, 18, 353, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 6, 18, 362, 10, 18, 13, 18, 14, 18, 363, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 374, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 382, 10, 18, 12, 18, 14, 18, 385, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 394, 10, 19, 3, 19, 5, 19, 397, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 406, 10, 20, 12, 20, 14, 20, 409, 11, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 418, 10, 20, 5, 20, 420, 10, 20, 3, 20, 3, 20, 5, 20, 424, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 433, 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, 7, 22, 449, 10, 22, 12, 22, 14, 22, 452, 11, 22, 3, 22, 5, 22, 455, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 464, 10, 22, 12, 22, 14, 22, 467, 11, 22, 3, 22, 5, 22, 470, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 479, 10, 22, 12, 22, 14, 22, 482, 11, 22, 3, 22, 5, 22, 485, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 494, 10, 22, 12, 22, 14, 22, 497, 11, 22, 3, 22, 5, 22, 500, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 508, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 516, 10, 22, 12, 22, 14, 22, 519, 11, 22, 3, 22, 5, 22, 522, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 530, 10, 22, 12, 22, 14, 22, 533, 11, 22, 3, 22, 5, 22, 536, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 544, 10, 22, 12, 22, 14, 22, 547, 11, 22, 5, 22, 549, 10, 22, 3, 22, 5, 22, 552, 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, 5, 22, 577, 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, 5, 22, 616, 10, 22, 3, 22, 5, 22, 619, 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, 6, 22, 635, 10, 22, 13, 22, 14, 22, 636, 7, 22, 639, 10, 22, 12, 22, 14, 22, 642, 11, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 653, 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 7, 24, 663, 10, 24, 12, 24, 14, 24, 666, 11, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 672, 10, 24, 3, 25, 3, 25, 5, 25, 676, 10, 25, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 682, 10, 27, 3, 28, 3, 28, 3, 28, 7, 28, 687, 10, 28, 12, 28, 14, 28, 690, 11, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 698, 10, 29, 3, 30, 3, 30, 5, 30, 702, 10, 30, 3, 31, 3, 31, 5, 31, 706, 10, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 7, 34, 715, 10, 34, 12, 34, 14, 34, 718, 11, 34, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 724, 10, 35, 3, 35, 2, 2, 4, 34, 42, 36, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 2, 9, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 2, 824, 2, 71, 3, 2, 2, 2, 4, 80, 3, 2, 2, 2, 6, 97, 3, 2, 2, 2, 8, 122, 3, 2, 2, 2, 10, 124, 3, 2, 2, 2, 12, 192, 3, 2, 2, 2, 14, 194, 3, 2, 2, 2, 16, 201, 3, 2, 2, 2, 18, 221, 3, 2, 2, 2, 20, 241, 3, 2, 2, 2, 22, 254, 3, 2, 2, 2, 24, 302, 3, 2, 2, 2, 26, 304, 3, 2, 2, 2, 28, 306, 3, 2, 2, 2, 30, 308, 3, 2, 2, 2, 32, 310, 3, 2, 2, 2, 34, 373, 3, 2, 2, 2, 36, 386, 3, 2, 2, 2, 38, 423, 3, 2, 2, 2, 40, 425, 3, 2, 2, 2, 42, 576, 3, 2, 2, 2, 44, 652, 3, 2, 2, 2, 46, 671, 3, 2, 2, 2, 48, 675, 3, 2, 2, 2, 50, 677, 3, 2, 2, 2, 52, 681, 3, 2, 2, 2, 54, 683, 3, 2, 2, 2, 56, 697, 3, 2, 2, 2, 58, 701, 3, 2, 2, 2, 60, 705, 3, 2, 2, 2, 62, 707, 3, 2, 2, 2, 64, 709, 3, 2, 2, 2, 66, 711, 3, 2, 2, 2, 68, 723, 3, 2, 2, 2, 70, 72, 5, 4, 3, 2, 71, 70, 3, 2, 2, 2, 72, 73, 3, 2, 2, 2, 73, 71, 3, 2, 2, 2, 73, 74, 3, 2, 2, 2, 74, 75, 3, 2, 2, 2, 75, 76, 7, 2, 2, 3, 76, 3, 3, 2, 2, 2, 77, 79, 7, 68, 2, 2, 78, 77, 3, 2, 2, 2, 79, 82, 3, 2, 2, 2, 80, 78, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 83, 3, 2, 2, 2, 82, 80, 3, 2, 2, 2, 83, 84, 7, 3, 2, 2, 84, 85, 5, 66, 34, 2, 85, 89, 7, 4, 2, 2, 86, 88, 5, 6, 4, 2, 87, 86, 3, 2, 2, 2, 88, 91, 3, 2, 2, 2, 89, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 92, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 92, 93, 7, 5, 2, 2, 93, 5, 3, 2, 2, 2, 94, 96, 7, 68, 2, 2, 95, 94, 3, 2, 2, 2, 96, 99, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 100, 3, 2, 2, 2, 99, 97, 3, 2, 2, 2, 100, 101, 5, 8, 5, 2, 101, 7, 3, 2, 2, 2, 102, 103, 7, 6, 2, 2, 103, 104, 5, 66, 34, 2, 104, 105, 7, 7, 2, 2, 105, 106, 5, 34, 18, 2, 106, 123, 3, 2, 2, 2, 107, 108, 7, 8, 2, 2, 108, 109, 5, 66, 34, 2, 109, 110, 7, 7, 2, 2, 110, 111, 5, 34, 18, 2, 111, 123, 3, 2, 2, 2, 112, 113, 7, 9, 2, 2, 113, 114, 5, 48, 25, 2, 114, 115, 7, 64, 2, 2, 115, 116, 5, 42, 22, 2, 116, 123, 3, 2, 2, 2, 117, 123, 5, 24, 13, 2, 118, 123, 5, 10, 6, 2, 119, 123, 5, 12, 7, 2, 120, 123, 5, 20, 11, 2, 121, 123, 5, 22, 12, 2, 122, 102, 3, 2, 2, 2, 122, 107, 3, 2, 2, 2, 122, 112, 3, 2, 2, 2, 122, 117, 3, 2, 2, 2, 122, 118, 3, 2, 2, 2, 122, 119, 3, 2, 2, 2, 122, 120, 3, 2, 2, 2, 122, 121, 3, 2, 2, 2, 123, 9, 3, 2, 2, 2, 124, 125, 5, 18, 10, 2, 125, 162, 5, 58, 30, 2, 126, 135, 7, 65, 2, 2, 127, 132, 5, 50, 26, 2, 128, 129, 7, 10, 2, 2, 129, 131, 5, 50, 26, 2, 130, 128, 3, 2, 2, 2, 131, 134, 3, 2, 2, 2, 132, 130, 3, 2, 2, 2, 132, 133, 3, 2, 2, 2, 133, 136, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 135, 127, 3, 2, 2, 2, 135, 136, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 140, 7, 66, 2, 2, 138, 139, 7, 7, 2, 2, 139, 141, 5, 34, 18, 2, 140, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 163, 3, 2, 2, 2, 142, 143, 7, 7, 2, 2, 143, 163, 5, 34, 18, 2, 144, 145, 7, 65, 2, 2, 145, 146, 5, 50, 26, 2, 146, 147, 7, 7, 2, 2, 147, 155, 5, 34, 18, 2, 148, 149, 7, 10, 2, 2, 149, 150, 5, 50, 26, 2, 150, 151, 7, 7, 2, 2, 151, 152, 5, 34, 18, 2, 152, 154, 3, 2, 2, 2, 153, 148, 3, 2, 2, 2, 154, 157, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 156, 3, 2, 2, 2, 156, 158, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 158, 159, 7, 66, 2, 2, 159, 160, 7, 7, 2, 2, 160, 161, 5, 34, 18, 2, 161, 163, 3, 2, 2, 2, 162, 126, 3, 2, 2, 2, 162, 142, 3, 2, 2, 2, 162, 144, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 166, 3, 2, 2, 2, 164, 165, 7, 64, 2, 2, 165, 167, 5, 42, 22, 2, 166, 164, 3, 2, 2, 2, 166, 167, 3, 2, 2, 2, 167, 169, 3, 2, 2, 2, 168, 170, 7, 11, 2, 2, 169, 168, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 11, 3, 2, 2, 2, 171, 172, 7, 12, 2, 2, 172, 193, 5, 66, 34, 2, 173, 174, 7, 12, 2, 2, 174, 175, 5, 66, 34, 2, 175, 176, 7, 64, 2, 2, 176, 177, 5, 34, 18, 2, 177, 193, 3, 2, 2, 2, 178, 179, 7, 12, 2, 2, 179, 180, 5, 66, 34, 2, 180, 182, 7, 64, 2, 2, 181, 183, 7, 13, 2, 2, 182, 181, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 189, 5, 14, 8, 2, 185, 186, 7, 13, 2, 2, 186, 188, 5, 14, 8, 2, 187, 185, 3, 2, 2, 2, 188, 191, 3, 2, 2, 2, 189, 187, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 193, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 192, 171, 3, 2, 2, 2, 192, 173, 3, 2, 2, 2, 192, 178, 3, 2, 2, 2, 193, 13, 3, 2, 2, 2, 194, 199, 5, 68, 35, 2, 195, 196, 7, 65, 2, 2, 196, 197, 5, 34, 18, 2, 197, 198, 7, 66, 2, 2, 198, 200, 3, 2, 2, 2, 199, 195, 3, 2, 2, 2, 199, 200, 3, 2, 2, 2, 200, 15, 3, 2, 2, 2, 201, 202, 7, 14, 2, 2, 202, 205, 5, 66, 34, 2, 203, 204, 7, 7, 2, 2, 204, 206, 5, 34, 18, 2, 205, 203, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 3, 2, 2, 2, 207, 208, 7, 64, 2, 2, 208, 210, 5, 42, 22, 2, 209, 211, 7, 11, 2, 2, 210, 209, 3, 2, 2, 2, 210, 211, 3, 2, 2, 2, 211, 17, 3, 2, 2, 2, 212, 222, 7, 15, 2, 2, 213, 222, 7, 16, 2, 2, 214, 215, 7, 17, 2, 2, 215, 222, 7, 15, 2, 2, 216, 217, 7, 17, 2, 2, 217, 222, 7, 16, 2, 2, 218, 222, 7, 18, 2, 2, 219, 222, 7, 19, 2, 2, 220, 222, 7, 20, 2, 2, 221, 212, 3, 2, 2, 2, 221, 213, 3, 2, 2, 2, 221, 214, 3, 2, 2, 2, 221, 216, 3, 2, 2, 2, 221, 218, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 221, 220, 3, 2, 2, 2, 222, 19, 3, 2, 2, 2, 223, 224, 7, 21, 2, 2, 224, 225, 5, 28, 15, 2, 225, 226, 7, 22, 2, 2, 226, 229, 5, 52, 27, 2, 227, 228, 7, 23, 2, 2, 228, 230, 5, 32, 17, 2, 229, 227, 3, 2, 2, 2, 229, 230, 3, 2, 2, 2, 230, 242, 3, 2, 2, 2, 231, 232, 7, 21, 2, 2, 232, 235, 5, 28, 15, 2, 233, 234, 7, 24, 2, 2, 234, 236, 5, 28, 15, 2, 235, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 239, 3, 2, 2, 2, 237, 238, 7, 23, 2, 2, 238, 240, 5, 32, 17, 2, 239, 237, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 242, 3, 2, 2, 2, 241, 223, 3, 2, 2, 2, 241, 231, 3, 2, 2, 2, 242, 21, 3, 2, 2, 2, 243, 244, 7, 25, 2, 2, 244, 245, 5, 28, 15, 2, 245, 246, 7, 22, 2, 2, 246, 247, 5, 52, 27, 2, 247, 255, 3, 2, 2, 2, 248, 249, 7, 25, 2, 2, 249, 252, 5, 28, 15, 2, 250, 251, 7, 24, 2, 2, 251, 253, 5, 28, 15, 2, 252, 250, 3, 2, 2, 2, 252, 253, 3, 2, 2, 2, 253, 255, 3, 2, 2, 2, 254, 243, 3, 2, 2, 2, 254, 248, 3, 2, 2, 2, 255, 23, 3, 2, 2, 2, 256, 257, 7, 21, 2, 2, 257, 258, 5, 26, 14, 2, 258, 259, 7, 65, 2, 2, 259, 260, 5, 28, 15, 2, 260, 261, 7, 64, 2, 2, 261, 269, 5, 42, 22, 2, 262, 263, 7, 10, 2, 2, 263, 264, 5, 28, 15, 2, 264, 265, 7, 64, 2, 2, 265, 266, 5, 42, 22, 2, 266, 268, 3, 2, 2, 2, 267, 262, 3, 2, 2, 2, 268, 271, 3, 2, 2, 2, 269, 267, 3, 2, 2, 2, 269, 270, 3, 2, 2, 2, 270, 272, 3, 2, 2, 2, 271, 269, 3, 2, 2, 2, 272, 273, 7, 66, 2, 2, 273, 274, 7, 22, 2, 2, 274, 277, 7, 55, 2, 2, 275, 276, 7, 23, 2, 2, 276, 278, 5, 32, 17, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 303, 3, 2, 2, 2, 279, 280, 7, 21, 2, 2, 280, 281, 5, 26, 14, 2, 281, 282, 7, 65, 2, 2, 282, 283, 5, 28, 15, 2, 283, 284, 7, 64, 2, 2, 284, 292, 5, 42, 22, 2, 285, 286, 7, 10, 2, 2, 286, 287, 5, 28, 15, 2, 287, 288, 7, 64, 2, 2, 288, 289, 5, 42, 22, 2, 289, 291, 3, 2, 2, 2, 290, 285, 3, 2, 2, 2, 291, 294, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 292, 293, 3, 2, 2, 2, 293, 295, 3, 2, 2, 2, 294, 292, 3, 2, 2, 2, 295, 296, 7, 66, 2, 2, 296, 297, 7, 24, 2, 2, 297, 300, 5, 30, 16, 2, 298, 299, 7, 23, 2, 2, 299, 301, 5, 32, 17, 2, 300, 298, 3, 2, 2, 2, 300, 301, 3, 2, 2, 2, 301, 303, 3, 2, 2, 2, 302, 256, 3, 2, 2, 2, 302, 279, 3, 2, 2, 2, 303, 25, 3, 2, 2, 2, 304, 305, 5, 66, 34, 2, 305, 27, 3, 2, 2, 2, 306, 307, 5, 66, 34, 2, 307, 29, 3, 2, 2, 2, 308, 309, 5, 66, 34, 2, 309, 31, 3, 2, 2, 2, 310, 311, 7, 42, 2, 2, 311, 33, 3, 2, 2, 2, 312, 313, 8, 18, 1, 2, 313, 322, 7, 65, 2, 2, 314, 319, 5, 34, 18, 2, 315, 316, 7, 10, 2, 2, 316, 318, 5, 34, 18, 2, 317, 315, 3, 2, 2, 2, 318, 321, 3, 2, 2, 2, 319, 317, 3, 2, 2, 2, 319, 320, 3, 2, 2, 2, 320, 323, 3, 2, 2, 2, 321, 319, 3, 2, 2, 2, 322, 314, 3, 2, 2, 2, 322, 323, 3, 2, 2, 2, 323, 325, 3, 2, 2, 2, 324, 326, 7, 10, 2, 2, 325, 324, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 328, 7, 66, 2, 2, 328, 329, 7, 27, 2, 2, 329, 374, 5, 34, 18, 13, 330, 331, 7, 49, 2, 2, 331, 332, 7, 28, 2, 2, 332, 333, 5, 34, 18, 2, 333, 334, 7, 29, 2, 2, 334, 374, 3, 2, 2, 2, 335, 336, 7, 50, 2, 2, 336, 337, 7, 28, 2, 2, 337, 338, 5, 34, 18, 2, 338, 339, 7, 29, 2, 2, 339, 374, 3, 2, 2, 2, 340, 341, 7, 65, 2, 2, 341, 342, 5, 34, 18, 2, 342, 343, 7, 10, 2, 2, 343, 348, 5, 34, 18, 2, 344, 345, 7, 10, 2, 2, 345, 347, 5, 34, 18, 2, 346, 344, 3, 2, 2, 2, 347, 350, 3, 2, 2, 2, 348, 346, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 352, 3, 2, 2, 2, 350, 348, 3, 2, 2, 2, 351, 353, 7, 10, 2, 2, 352, 351, 3, 2, 2, 2, 352, 353, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 355, 7, 66, 2, 2, 355, 374, 3, 2, 2, 2, 356, 357, 7, 4, 2, 2, 357, 358, 5, 38, 20, 2, 358, 359, 7, 5, 2, 2, 359, 374, 3, 2, 2, 2, 360, 362, 5, 36, 19, 2, 361, 360, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 361, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 374, 3, 2, 2, 2, 365, 374, 7, 30, 2, 2, 366, 374, 7, 31, 2, 2, 367, 374, 7, 32, 2, 2, 368, 374, 5, 66, 34, 2, 369, 370, 7, 65, 2, 2, 370, 371, 5, 34, 18, 2, 371, 372, 7, 66, 2, 2, 372, 374, 3, 2, 2, 2, 373, 312, 3, 2, 2, 2, 373, 330, 3, 2, 2, 2, 373, 335, 3, 2, 2, 2, 373, 340, 3, 2, 2, 2, 373, 356, 3, 2, 2, 2, 373, 361, 3, 2, 2, 2, 373, 365, 3, 2, 2, 2, 373, 366, 3, 2, 2, 2, 373, 367, 3, 2, 2, 2, 373, 368, 3, 2, 2, 2, 373, 369, 3, 2, 2, 2, 374, 383, 3, 2, 2, 2, 375, 376, 12, 15, 2, 2, 376, 377, 7, 26, 2, 2, 377, 382, 5, 34, 18, 15, 378, 379, 12, 14, 2, 2, 379, 380, 7, 27, 2, 2, 380, 382, 5, 34, 18, 14, 381, 375, 3, 2, 2, 2, 381, 378, 3, 2, 2, 2, 382, 385, 3, 2, 2, 2, 383, 381, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 35, 3, 2, 2, 2, 385, 383, 3, 2, 2, 2, 386, 387, 7, 13, 2, 2, 387, 388, 7, 4, 2, 2, 388, 389, 5, 66, 34, 2, 389, 390, 7, 7, 2, 2, 390, 393, 7, 42, 2, 2, 391, 392, 7, 10, 2, 2, 392, 394, 5, 38, 20, 2, 393, 391, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 396, 3, 2, 2, 2, 395, 397, 7, 10, 2, 2, 396, 395, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 399, 7, 5, 2, 2, 399, 37, 3, 2, 2, 2, 400, 401, 5, 40, 21, 2, 401, 402, 7, 7, 2, 2, 402, 403, 5, 34, 18, 2, 403, 404, 7, 10, 2, 2, 404, 406, 3, 2, 2, 2, 405, 400, 3, 2, 2, 2, 406, 409, 3, 2, 2, 2, 407, 405, 3, 2, 2, 2, 407, 408, 3, 2, 2, 2, 408, 419, 3, 2, 2, 2, 409, 407, 3, 2, 2, 2, 410, 411, 5, 40, 21, 2, 411, 412, 7, 7, 2, 2, 412, 413, 5, 34, 18, 2, 413, 417, 3, 2, 2, 2, 414, 418, 7, 10, 2, 2, 415, 416, 7, 13, 2, 2, 416, 418, 7, 67, 2, 2, 417, 414, 3, 2, 2, 2, 417, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 420, 3, 2, 2, 2, 419, 410, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 424, 3, 2, 2, 2, 421, 422, 7, 13, 2, 2, 422, 424, 7, 67, 2, 2, 423, 407, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 424, 39, 3, 2, 2, 2, 425, 426, 5, 68, 35, 2, 426, 41, 3, 2, 2, 2, 427, 428, 8, 22, 1, 2, 428, 577, 5, 46, 24, 2, 429, 430, 5, 58, 30, 2, 430, 432, 7, 65, 2, 2, 431, 433, 5, 54, 28, 2, 432, 431, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 7, 66, 2, 2, 435, 577, 3, 2, 2, 2, 436, 437, 7, 54, 2, 2, 437, 577, 5, 42, 22, 27, 438, 439, 5, 66, 34, 2, 439, 440, 7, 34, 2, 2, 440, 441, 7, 64, 2, 2, 441, 442, 5, 42, 22, 23, 442, 577, 3, 2, 2, 2, 443, 444, 7, 45, 2, 2, 444, 445, 7, 4, 2, 2, 445, 450, 5, 42, 22, 2, 446, 447, 7, 10, 2, 2, 447, 449, 5, 42, 22, 2, 448, 446, 3, 2, 2, 2, 449, 452, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 454, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 453, 455, 7, 10, 2, 2, 454, 453, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 457, 7, 5, 2, 2, 457, 577, 3, 2, 2, 2, 458, 459, 7, 46, 2, 2, 459, 460, 7, 4, 2, 2, 460, 465, 5, 42, 22, 2, 461, 462, 7, 10, 2, 2, 462, 464, 5, 42, 22, 2, 463, 461, 3, 2, 2, 2, 464, 467, 3, 2, 2, 2, 465, 463, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 469, 3, 2, 2, 2, 467, 465, 3, 2, 2, 2, 468, 470, 7, 10, 2, 2, 469, 468, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 472, 7, 5, 2, 2, 472, 577, 3, 2, 2, 2, 473, 474, 7, 35, 2, 2, 474, 475, 7, 4, 2, 2, 475, 480, 5, 42, 22, 2, 476, 477, 7, 10, 2, 2, 477, 479, 5, 42, 22, 2, 478, 476, 3, 2, 2, 2, 479, 482, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 483, 485, 7, 10, 2, 2, 484, 483, 3, 2, 2, 2, 484, 485, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 7, 5, 2, 2, 487, 577, 3, 2, 2, 2, 488, 489, 7, 36, 2, 2, 489, 490, 7, 4, 2, 2, 490, 495, 5, 42, 22, 2, 491, 492, 7, 10, 2, 2, 492, 494, 5, 42, 22, 2, 493, 491, 3, 2, 2, 2, 494, 497, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 499, 3, 2, 2, 2, 497, 495, 3, 2, 2, 2, 498, 500, 7, 10, 2, 2, 499, 498, 3, 2, 2, 2, 499, 500, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 7, 5, 2, 2, 502, 577, 3, 2, 2, 2, 503, 508, 5, 66, 34, 2, 504, 508, 7, 44, 2, 2, 505, 508, 7, 43, 2, 2, 506, 508, 7, 42, 2, 2, 507, 503, 3, 2, 2, 2, 507, 504, 3, 2, 2, 2, 507, 505, 3, 2, 2, 2, 507, 506, 3, 2, 2, 2, 508, 577, 3, 2, 2, 2, 509, 510, 7, 65, 2, 2, 510, 511, 5, 42, 22, 2, 511, 512, 7, 10, 2, 2, 512, 517, 5, 42, 22, 2, 513, 514, 7, 10, 2, 2, 514, 516, 5, 42, 22, 2, 515, 513, 3, 2, 2, 2, 516, 519, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 521, 3, 2, 2, 2, 519, 517, 3, 2, 2, 2, 520, 522, 7, 10, 2, 2, 521, 520, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 7, 66, 2, 2, 524, 577, 3, 2, 2, 2, 525, 526, 7, 4, 2, 2, 526, 531, 5, 56, 29, 2, 527, 528, 7, 10, 2, 2, 528, 530, 5, 56, 29, 2, 529, 527, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 535, 3, 2, 2, 2, 533, 531, 3, 2, 2, 2, 534, 536, 7, 10, 2, 2, 535, 534, 3, 2, 2, 2, 535, 536, 3, 2, 2, 2, 536, 537, 3, 2, 2, 2, 537, 538, 7, 5, 2, 2, 538, 577, 3, 2, 2, 2, 539, 548, 7, 28, 2, 2, 540, 545, 5, 42, 22, 2, 541, 542, 7, 10, 2, 2, 542, 544, 5, 42, 22, 2, 543, 541, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 540, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 551, 3, 2, 2, 2, 550, 552, 7, 10, 2, 2, 551, 550, 3, 2, 2, 2, 551, 552, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 577, 7, 29, 2, 2, 554, 555, 7, 37, 2, 2, 555, 556, 7, 65, 2, 2, 556, 557, 5, 42, 22, 2, 557, 558, 7, 66, 2, 2, 558, 559, 5, 42, 22, 2, 559, 560, 7, 38, 2, 2, 560, 561, 5, 42, 22, 7, 561, 577, 3, 2, 2, 2, 562, 563, 5, 10, 6, 2, 563, 564, 5, 42, 22, 6, 564, 577, 3, 2, 2, 2, 565, 566, 5, 16, 9, 2, 566, 567, 5, 42, 22, 5, 567, 577, 3, 2, 2, 2, 568, 569, 7, 65, 2, 2, 569, 570, 5, 42, 22, 2, 570, 571, 7, 66, 2, 2, 571, 577, 3, 2, 2, 2, 572, 573, 7, 4, 2, 2, 573, 574, 5, 42, 22, 2, 574, 575, 7, 5, 2, 2, 575, 577, 3, 2, 2, 2, 576, 427, 3, 2, 2, 2, 576, 429, 3, 2, 2, 2, 576, 436, 3, 2, 2, 2, 576, 438, 3, 2, 2, 2, 576, 443, 3, 2, 2, 2, 576, 458, 3, 2, 2, 2, 576, 473, 3, 2, 2, 2, 576, 488, 3, 2, 2, 2, 576, 507, 3, 2, 2, 2, 576, 509, 3, 2, 2, 2, 576, 525, 3, 2, 2, 2, 576, 539, 3, 2, 2, 2, 576, 554, 3, 2, 2, 2, 576, 562, 3, 2, 2, 2, 576, 565, 3, 2, 2, 2, 576, 568, 3, 2, 2, 2, 576, 572, 3, 2, 2, 2, 577, 640, 3, 2, 2, 2, 578, 579, 12, 28, 2, 2, 579, 580, 7, 33, 2, 2, 580, 639, 5, 42, 22, 28, 581, 582, 12, 26, 2, 2, 582, 583, 9, 2, 2, 2, 583, 639, 5, 42, 22, 27, 584, 585, 12, 25, 2, 2, 585, 586, 9, 3, 2, 2, 586, 639, 5, 42, 22, 26, 587, 588, 12, 24, 2, 2, 588, 589, 9, 4, 2, 2, 589, 639, 5, 42, 22, 25, 590, 591, 12, 22, 2, 2, 591, 592, 7, 64, 2, 2, 592, 593, 5, 42, 22, 23, 593, 594, 8, 22, 1, 2, 594, 639, 3, 2, 2, 2, 595, 596, 12, 20, 2, 2, 596, 597, 7, 45, 2, 2, 597, 639, 5, 42, 22, 21, 598, 599, 12, 18, 2, 2, 599, 600, 7, 46, 2, 2, 600, 639, 5, 42, 22, 19, 601, 602, 12, 17, 2, 2, 602, 603, 7, 47, 2, 2, 603, 639, 5, 42, 22, 18, 604, 605, 12, 16, 2, 2, 605, 606, 7, 48, 2, 2, 606, 639, 5, 42, 22, 17, 607, 608, 12, 10, 2, 2, 608, 609, 7, 26, 2, 2, 609, 639, 5, 42, 22, 11, 610, 611, 12, 32, 2, 2, 611, 612, 7, 22, 2, 2, 612, 618, 5, 60, 31, 2, 613, 615, 7, 65, 2, 2, 614, 616, 5, 54, 28, 2, 615, 614, 3, 2, 2, 2, 615, 616, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 619, 7, 66, 2, 2, 618, 613, 3, 2, 2, 2, 618, 619, 3, 2, 2, 2, 619, 639, 3, 2, 2, 2, 620, 621, 12, 29, 2, 2, 621, 622, 7, 28, 2, 2, 622, 623, 5, 42, 22, 2, 623, 624, 7, 29, 2, 2, 624, 639, 3, 2, 2, 2, 625, 626, 12, 15, 2, 2, 626, 634, 7, 52, 2, 2, 627, 628, 7, 13, 2, 2, 628, 629, 7, 42, 2, 2, 629, 630, 7, 7, 2, 2, 630, 631, 5, 50, 26, 2, 631, 632, 7, 27, 2, 2, 632, 633, 5, 42, 22, 2, 633, 635, 3, 2, 2, 2, 634, 627, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 634, 3, 2, 2, 2, 636, 637, 3, 2, 2, 2, 637, 639, 3, 2, 2, 2, 638, 578, 3, 2, 2, 2, 638, 581, 3, 2, 2, 2, 638, 584, 3, 2, 2, 2, 638, 587, 3, 2, 2, 2, 638, 590, 3, 2, 2, 2, 638, 595, 3, 2, 2, 2, 638, 598, 3, 2, 2, 2, 638, 601, 3, 2, 2, 2, 638, 604, 3, 2, 2, 2, 638, 607, 3, 2, 2, 2, 638, 610, 3, 2, 2, 2, 638, 620, 3, 2, 2, 2, 638, 625, 3, 2, 2, 2, 639, 642, 3, 2, 2, 2, 640, 638, 3, 2, 2, 2, 640, 641, 3, 2, 2, 2, 641, 43, 3, 2, 2, 2, 642, 640, 3, 2, 2, 2, 643, 644, 5, 8, 5, 2, 644, 645, 7, 2, 2, 3, 645, 653, 3, 2, 2, 2, 646, 647, 5, 42, 22, 2, 647, 648, 7, 2, 2, 3, 648, 653, 3, 2, 2, 2, 649, 650, 7, 68, 2, 2, 650, 653, 7, 2, 2, 3, 651, 653, 7, 2, 2, 3, 652, 643, 3, 2, 2, 2, 652, 646, 3, 2, 2, 2, 652, 649, 3, 2, 2, 2, 652, 651, 3, 2, 2, 2, 653, 45, 3, 2, 2, 2, 654, 655, 5, 50, 26, 2, 655, 656, 7, 27, 2, 2, 656, 657, 5, 42, 22, 2, 657, 672, 3, 2, 2, 2, 658, 659, 7, 65, 2, 2, 659, 664, 5, 50, 26, 2, 660, 661, 7, 10, 2, 2, 661, 663, 5, 50, 26, 2, 662, 660, 3, 2, 2, 2, 663, 666, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 664, 665, 3, 2, 2, 2, 665, 667, 3, 2, 2, 2, 666, 664, 3, 2, 2, 2, 667, 668, 7, 66, 2, 2, 668, 669, 7, 27, 2, 2, 669, 670, 5, 42, 22, 2, 670, 672, 3, 2, 2, 2, 671, 654, 3, 2, 2, 2, 671, 658, 3, 2, 2, 2, 672, 47, 3, 2, 2, 2, 673, 676, 7, 39, 2, 2, 674, 676, 5, 66, 34, 2, 675, 673, 3, 2, 2, 2, 675, 674, 3, 2, 2, 2, 676, 49, 3, 2, 2, 2, 677, 678, 5, 48, 25, 2, 678, 51, 3, 2, 2, 2, 679, 682, 7, 55, 2, 2, 680, 682, 5, 66, 34, 2, 681, 679, 3, 2, 2, 2, 681, 680, 3, 2, 2, 2, 682, 53, 3, 2, 2, 2, 683, 688, 5, 42, 22, 2, 684, 685, 7, 10, 2, 2, 685, 687, 5, 42, 22, 2, 686, 684, 3, 2, 2, 2, 687, 690, 3, 2, 2, 2, 688, 686, 3, 2, 2, 2, 688, 689, 3, 2, 2, 2, 689, 55, 3, 2, 2, 2, 690, 688, 3, 2, 2, 2, 691, 692, 5, 68, 35, 2, 692, 693, 7, 7, 2, 2, 693, 694, 5, 42, 22, 2, 694, 698, 3, 2, 2, 2, 695, 696, 7, 40, 2, 2, 696, 698, 5, 42, 22, 2, 697, 691, 3, 2, 2, 2, 697, 695, 3, 2, 2, 2, 698, 57, 3, 2, 2, 2, 699, 702, 5, 66, 34, 2, 700, 702, 9, 5, 2, 2, 701, 699, 3, 2, 2, 2, 701, 700, 3, 2, 2, 2, 702, 59, 3, 2, 2, 2, 703, 706, 5, 66, 34, 2, 704, 706, 9, 6, 2, 2, 705, 703, 3, 2, 2, 2, 705, 704, 3, 2, 2, 2, 706, 61, 3, 2, 2, 2, 707, 708, 9, 7, 2, 2, 708, 63, 3, 2, 2, 2, 709, 710, 9, 8, 2, 2, 710, 65, 3, 2, 2, 2, 711, 716, 7, 67, 2, 2, 712, 713, 7, 41, 2, 2, 713, 715, 7, 67, 2, 2, 714, 712, 3, 2, 2, 2, 715, 718, 3, 2, 2, 2, 716, 714, 3, 2, 2, 2, 716, 717, 3, 2, 2, 2, 717, 67, 3, 2, 2, 2, 718, 716, 3, 2, 2, 2, 719, 724, 7, 67, 2, 2, 720, 721, 5, 66, 34, 2, 721, 722, 8, 35, 1, 2, 722, 724, 3, 2, 2, 2, 723, 719, 3, 2, 2, 2, 723, 720, 3, 2, 2, 2, 724, 69, 3, 2, 2, 2, 81, 73, 80, 89, 97, 122, 132, 135, 140, 155, 162, 166, 169, 182, 189, 192, 199, 205, 210, 221, 229, 235, 239, 241, 252, 254, 269, 277, 292, 300, 302, 319, 322, 325, 348, 352, 363, 373, 381, 383, 393, 396, 407, 417, 419, 423, 432, 450, 454, 465, 469, 480, 484, 495, 499, 507, 517, 521, 531, 535, 545, 548, 551, 576, 615, 618, 636, 638, 640, 652, 664, 671, 675, 681, 688, 697, 701, 705, 716, 723] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 71, 765, 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, 3, 2, 6, 2, 78, 10, 2, 13, 2, 14, 2, 79, 3, 2, 3, 2, 3, 3, 7, 3, 85, 10, 3, 12, 3, 14, 3, 88, 11, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 94, 10, 3, 12, 3, 14, 3, 97, 11, 3, 3, 3, 3, 3, 3, 4, 7, 4, 102, 10, 4, 12, 4, 14, 4, 105, 11, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 129, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 137, 10, 6, 12, 6, 14, 6, 140, 11, 6, 5, 6, 142, 10, 6, 3, 6, 3, 6, 3, 6, 5, 6, 147, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 160, 10, 6, 12, 6, 14, 6, 163, 11, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 169, 10, 6, 3, 6, 3, 6, 5, 6, 173, 10, 6, 3, 6, 5, 6, 176, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 189, 10, 7, 3, 7, 3, 7, 3, 7, 7, 7, 194, 10, 7, 12, 7, 14, 7, 197, 11, 7, 5, 7, 199, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 206, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 212, 10, 9, 3, 9, 3, 9, 3, 9, 5, 9, 217, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 228, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 236, 10, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 242, 10, 11, 3, 11, 3, 11, 5, 11, 246, 10, 11, 5, 11, 248, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 259, 10, 12, 5, 12, 261, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 274, 10, 13, 12, 13, 14, 13, 277, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 284, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 297, 10, 13, 12, 13, 14, 13, 300, 11, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 307, 10, 13, 5, 13, 309, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 324, 10, 18, 12, 18, 14, 18, 327, 11, 18, 5, 18, 329, 10, 18, 3, 18, 5, 18, 332, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 353, 10, 18, 12, 18, 14, 18, 356, 11, 18, 3, 18, 5, 18, 359, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 6, 18, 368, 10, 18, 13, 18, 14, 18, 369, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 5, 18, 380, 10, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 388, 10, 18, 12, 18, 14, 18, 391, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 5, 19, 400, 10, 19, 3, 19, 5, 19, 403, 10, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 412, 10, 20, 12, 20, 14, 20, 415, 11, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 5, 20, 424, 10, 20, 5, 20, 426, 10, 20, 3, 20, 3, 20, 5, 20, 430, 10, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 439, 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, 7, 22, 455, 10, 22, 12, 22, 14, 22, 458, 11, 22, 3, 22, 5, 22, 461, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 470, 10, 22, 12, 22, 14, 22, 473, 11, 22, 3, 22, 5, 22, 476, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 486, 10, 22, 12, 22, 14, 22, 489, 11, 22, 3, 22, 5, 22, 492, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 501, 10, 22, 12, 22, 14, 22, 504, 11, 22, 3, 22, 5, 22, 507, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 515, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 523, 10, 22, 12, 22, 14, 22, 526, 11, 22, 3, 22, 5, 22, 529, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 537, 10, 22, 12, 22, 14, 22, 540, 11, 22, 3, 22, 5, 22, 543, 10, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 551, 10, 22, 12, 22, 14, 22, 554, 11, 22, 5, 22, 556, 10, 22, 3, 22, 5, 22, 559, 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, 5, 22, 584, 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, 5, 22, 623, 10, 22, 3, 22, 5, 22, 626, 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, 6, 22, 642, 10, 22, 13, 22, 14, 22, 643, 7, 22, 646, 10, 22, 12, 22, 14, 22, 649, 11, 22, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 655, 10, 23, 3, 23, 3, 23, 3, 23, 7, 23, 660, 10, 23, 12, 23, 14, 23, 663, 11, 23, 3, 23, 3, 23, 3, 24, 3, 24, 5, 24, 669, 10, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 678, 10, 25, 3, 25, 5, 25, 681, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 692, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 702, 10, 27, 12, 27, 14, 27, 705, 11, 27, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 711, 10, 27, 3, 28, 3, 28, 5, 28, 715, 10, 28, 3, 29, 3, 29, 3, 30, 3, 30, 5, 30, 721, 10, 30, 3, 31, 3, 31, 3, 31, 7, 31, 726, 10, 31, 12, 31, 14, 31, 729, 11, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 5, 32, 737, 10, 32, 3, 33, 3, 33, 5, 33, 741, 10, 33, 3, 34, 3, 34, 5, 34, 745, 10, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 7, 37, 754, 10, 37, 12, 37, 14, 37, 757, 11, 37, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 763, 10, 38, 3, 38, 2, 2, 4, 34, 42, 39, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 12, 2, 14, 2, 16, 2, 18, 2, 20, 2, 22, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 34, 2, 36, 2, 38, 2, 40, 2, 42, 2, 44, 2, 46, 2, 48, 2, 50, 2, 52, 2, 54, 2, 56, 2, 58, 2, 60, 2, 62, 2, 64, 2, 66, 2, 68, 2, 70, 2, 72, 2, 74, 2, 2, 9, 3, 2, 55, 57, 3, 2, 53, 54, 3, 2, 58, 63, 3, 2, 45, 51, 3, 2, 45, 48, 5, 2, 33, 33, 45, 48, 53, 63, 3, 2, 42, 44, 2, 866, 2, 77, 3, 2, 2, 2, 4, 86, 3, 2, 2, 2, 6, 103, 3, 2, 2, 2, 8, 128, 3, 2, 2, 2, 10, 130, 3, 2, 2, 2, 12, 198, 3, 2, 2, 2, 14, 200, 3, 2, 2, 2, 16, 207, 3, 2, 2, 2, 18, 227, 3, 2, 2, 2, 20, 247, 3, 2, 2, 2, 22, 260, 3, 2, 2, 2, 24, 308, 3, 2, 2, 2, 26, 310, 3, 2, 2, 2, 28, 312, 3, 2, 2, 2, 30, 314, 3, 2, 2, 2, 32, 316, 3, 2, 2, 2, 34, 379, 3, 2, 2, 2, 36, 392, 3, 2, 2, 2, 38, 429, 3, 2, 2, 2, 40, 431, 3, 2, 2, 2, 42, 583, 3, 2, 2, 2, 44, 650, 3, 2, 2, 2, 46, 668, 3, 2, 2, 2, 48, 673, 3, 2, 2, 2, 50, 691, 3, 2, 2, 2, 52, 710, 3, 2, 2, 2, 54, 714, 3, 2, 2, 2, 56, 716, 3, 2, 2, 2, 58, 720, 3, 2, 2, 2, 60, 722, 3, 2, 2, 2, 62, 736, 3, 2, 2, 2, 64, 740, 3, 2, 2, 2, 66, 744, 3, 2, 2, 2, 68, 746, 3, 2, 2, 2, 70, 748, 3, 2, 2, 2, 72, 750, 3, 2, 2, 2, 74, 762, 3, 2, 2, 2, 76, 78, 5, 4, 3, 2, 77, 76, 3, 2, 2, 2, 78, 79, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 79, 80, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 82, 7, 2, 2, 3, 82, 3, 3, 2, 2, 2, 83, 85, 7, 68, 2, 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, 3, 2, 2, 90, 91, 5, 72, 37, 2, 91, 95, 7, 4, 2, 2, 92, 94, 5, 6, 4, 2, 93, 92, 3, 2, 2, 2, 94, 97, 3, 2, 2, 2, 95, 93, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 98, 3, 2, 2, 2, 97, 95, 3, 2, 2, 2, 98, 99, 7, 5, 2, 2, 99, 5, 3, 2, 2, 2, 100, 102, 7, 68, 2, 2, 101, 100, 3, 2, 2, 2, 102, 105, 3, 2, 2, 2, 103, 101, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 106, 3, 2, 2, 2, 105, 103, 3, 2, 2, 2, 106, 107, 5, 8, 5, 2, 107, 7, 3, 2, 2, 2, 108, 109, 7, 6, 2, 2, 109, 110, 5, 72, 37, 2, 110, 111, 7, 7, 2, 2, 111, 112, 5, 34, 18, 2, 112, 129, 3, 2, 2, 2, 113, 114, 7, 8, 2, 2, 114, 115, 5, 72, 37, 2, 115, 116, 7, 7, 2, 2, 116, 117, 5, 34, 18, 2, 117, 129, 3, 2, 2, 2, 118, 119, 7, 9, 2, 2, 119, 120, 5, 54, 28, 2, 120, 121, 7, 64, 2, 2, 121, 122, 5, 42, 22, 2, 122, 129, 3, 2, 2, 2, 123, 129, 5, 24, 13, 2, 124, 129, 5, 10, 6, 2, 125, 129, 5, 12, 7, 2, 126, 129, 5, 20, 11, 2, 127, 129, 5, 22, 12, 2, 128, 108, 3, 2, 2, 2, 128, 113, 3, 2, 2, 2, 128, 118, 3, 2, 2, 2, 128, 123, 3, 2, 2, 2, 128, 124, 3, 2, 2, 2, 128, 125, 3, 2, 2, 2, 128, 126, 3, 2, 2, 2, 128, 127, 3, 2, 2, 2, 129, 9, 3, 2, 2, 2, 130, 131, 5, 18, 10, 2, 131, 168, 5, 64, 33, 2, 132, 141, 7, 65, 2, 2, 133, 138, 5, 56, 29, 2, 134, 135, 7, 10, 2, 2, 135, 137, 5, 56, 29, 2, 136, 134, 3, 2, 2, 2, 137, 140, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 142, 3, 2, 2, 2, 140, 138, 3, 2, 2, 2, 141, 133, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 146, 7, 66, 2, 2, 144, 145, 7, 7, 2, 2, 145, 147, 5, 34, 18, 2, 146, 144, 3, 2, 2, 2, 146, 147, 3, 2, 2, 2, 147, 169, 3, 2, 2, 2, 148, 149, 7, 7, 2, 2, 149, 169, 5, 34, 18, 2, 150, 151, 7, 65, 2, 2, 151, 152, 5, 56, 29, 2, 152, 153, 7, 7, 2, 2, 153, 161, 5, 34, 18, 2, 154, 155, 7, 10, 2, 2, 155, 156, 5, 56, 29, 2, 156, 157, 7, 7, 2, 2, 157, 158, 5, 34, 18, 2, 158, 160, 3, 2, 2, 2, 159, 154, 3, 2, 2, 2, 160, 163, 3, 2, 2, 2, 161, 159, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 164, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 164, 165, 7, 66, 2, 2, 165, 166, 7, 7, 2, 2, 166, 167, 5, 34, 18, 2, 167, 169, 3, 2, 2, 2, 168, 132, 3, 2, 2, 2, 168, 148, 3, 2, 2, 2, 168, 150, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 172, 3, 2, 2, 2, 170, 171, 7, 64, 2, 2, 171, 173, 5, 42, 22, 2, 172, 170, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 175, 3, 2, 2, 2, 174, 176, 7, 11, 2, 2, 175, 174, 3, 2, 2, 2, 175, 176, 3, 2, 2, 2, 176, 11, 3, 2, 2, 2, 177, 178, 7, 12, 2, 2, 178, 199, 5, 72, 37, 2, 179, 180, 7, 12, 2, 2, 180, 181, 5, 72, 37, 2, 181, 182, 7, 64, 2, 2, 182, 183, 5, 34, 18, 2, 183, 199, 3, 2, 2, 2, 184, 185, 7, 12, 2, 2, 185, 186, 5, 72, 37, 2, 186, 188, 7, 64, 2, 2, 187, 189, 7, 13, 2, 2, 188, 187, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 195, 5, 14, 8, 2, 191, 192, 7, 13, 2, 2, 192, 194, 5, 14, 8, 2, 193, 191, 3, 2, 2, 2, 194, 197, 3, 2, 2, 2, 195, 193, 3, 2, 2, 2, 195, 196, 3, 2, 2, 2, 196, 199, 3, 2, 2, 2, 197, 195, 3, 2, 2, 2, 198, 177, 3, 2, 2, 2, 198, 179, 3, 2, 2, 2, 198, 184, 3, 2, 2, 2, 199, 13, 3, 2, 2, 2, 200, 205, 5, 74, 38, 2, 201, 202, 7, 65, 2, 2, 202, 203, 5, 34, 18, 2, 203, 204, 7, 66, 2, 2, 204, 206, 3, 2, 2, 2, 205, 201, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 15, 3, 2, 2, 2, 207, 208, 7, 14, 2, 2, 208, 211, 5, 72, 37, 2, 209, 210, 7, 7, 2, 2, 210, 212, 5, 34, 18, 2, 211, 209, 3, 2, 2, 2, 211, 212, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 214, 7, 64, 2, 2, 214, 216, 5, 42, 22, 2, 215, 217, 7, 11, 2, 2, 216, 215, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 17, 3, 2, 2, 2, 218, 228, 7, 15, 2, 2, 219, 228, 7, 16, 2, 2, 220, 221, 7, 17, 2, 2, 221, 228, 7, 15, 2, 2, 222, 223, 7, 17, 2, 2, 223, 228, 7, 16, 2, 2, 224, 228, 7, 18, 2, 2, 225, 228, 7, 19, 2, 2, 226, 228, 7, 20, 2, 2, 227, 218, 3, 2, 2, 2, 227, 219, 3, 2, 2, 2, 227, 220, 3, 2, 2, 2, 227, 222, 3, 2, 2, 2, 227, 224, 3, 2, 2, 2, 227, 225, 3, 2, 2, 2, 227, 226, 3, 2, 2, 2, 228, 19, 3, 2, 2, 2, 229, 230, 7, 21, 2, 2, 230, 231, 5, 28, 15, 2, 231, 232, 7, 22, 2, 2, 232, 235, 5, 58, 30, 2, 233, 234, 7, 23, 2, 2, 234, 236, 5, 32, 17, 2, 235, 233, 3, 2, 2, 2, 235, 236, 3, 2, 2, 2, 236, 248, 3, 2, 2, 2, 237, 238, 7, 21, 2, 2, 238, 241, 5, 28, 15, 2, 239, 240, 7, 24, 2, 2, 240, 242, 5, 28, 15, 2, 241, 239, 3, 2, 2, 2, 241, 242, 3, 2, 2, 2, 242, 245, 3, 2, 2, 2, 243, 244, 7, 23, 2, 2, 244, 246, 5, 32, 17, 2, 245, 243, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 248, 3, 2, 2, 2, 247, 229, 3, 2, 2, 2, 247, 237, 3, 2, 2, 2, 248, 21, 3, 2, 2, 2, 249, 250, 7, 25, 2, 2, 250, 251, 5, 28, 15, 2, 251, 252, 7, 22, 2, 2, 252, 253, 5, 58, 30, 2, 253, 261, 3, 2, 2, 2, 254, 255, 7, 25, 2, 2, 255, 258, 5, 28, 15, 2, 256, 257, 7, 24, 2, 2, 257, 259, 5, 28, 15, 2, 258, 256, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 261, 3, 2, 2, 2, 260, 249, 3, 2, 2, 2, 260, 254, 3, 2, 2, 2, 261, 23, 3, 2, 2, 2, 262, 263, 7, 21, 2, 2, 263, 264, 5, 26, 14, 2, 264, 265, 7, 65, 2, 2, 265, 266, 5, 28, 15, 2, 266, 267, 7, 64, 2, 2, 267, 275, 5, 42, 22, 2, 268, 269, 7, 10, 2, 2, 269, 270, 5, 28, 15, 2, 270, 271, 7, 64, 2, 2, 271, 272, 5, 42, 22, 2, 272, 274, 3, 2, 2, 2, 273, 268, 3, 2, 2, 2, 274, 277, 3, 2, 2, 2, 275, 273, 3, 2, 2, 2, 275, 276, 3, 2, 2, 2, 276, 278, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 278, 279, 7, 66, 2, 2, 279, 280, 7, 22, 2, 2, 280, 283, 7, 55, 2, 2, 281, 282, 7, 23, 2, 2, 282, 284, 5, 32, 17, 2, 283, 281, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 309, 3, 2, 2, 2, 285, 286, 7, 21, 2, 2, 286, 287, 5, 26, 14, 2, 287, 288, 7, 65, 2, 2, 288, 289, 5, 28, 15, 2, 289, 290, 7, 64, 2, 2, 290, 298, 5, 42, 22, 2, 291, 292, 7, 10, 2, 2, 292, 293, 5, 28, 15, 2, 293, 294, 7, 64, 2, 2, 294, 295, 5, 42, 22, 2, 295, 297, 3, 2, 2, 2, 296, 291, 3, 2, 2, 2, 297, 300, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 298, 299, 3, 2, 2, 2, 299, 301, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 302, 7, 66, 2, 2, 302, 303, 7, 24, 2, 2, 303, 306, 5, 30, 16, 2, 304, 305, 7, 23, 2, 2, 305, 307, 5, 32, 17, 2, 306, 304, 3, 2, 2, 2, 306, 307, 3, 2, 2, 2, 307, 309, 3, 2, 2, 2, 308, 262, 3, 2, 2, 2, 308, 285, 3, 2, 2, 2, 309, 25, 3, 2, 2, 2, 310, 311, 5, 72, 37, 2, 311, 27, 3, 2, 2, 2, 312, 313, 5, 72, 37, 2, 313, 29, 3, 2, 2, 2, 314, 315, 5, 72, 37, 2, 315, 31, 3, 2, 2, 2, 316, 317, 7, 42, 2, 2, 317, 33, 3, 2, 2, 2, 318, 319, 8, 18, 1, 2, 319, 328, 7, 65, 2, 2, 320, 325, 5, 34, 18, 2, 321, 322, 7, 10, 2, 2, 322, 324, 5, 34, 18, 2, 323, 321, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 329, 3, 2, 2, 2, 327, 325, 3, 2, 2, 2, 328, 320, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 331, 3, 2, 2, 2, 330, 332, 7, 10, 2, 2, 331, 330, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 333, 3, 2, 2, 2, 333, 334, 7, 66, 2, 2, 334, 335, 7, 27, 2, 2, 335, 380, 5, 34, 18, 13, 336, 337, 7, 49, 2, 2, 337, 338, 7, 28, 2, 2, 338, 339, 5, 34, 18, 2, 339, 340, 7, 29, 2, 2, 340, 380, 3, 2, 2, 2, 341, 342, 7, 50, 2, 2, 342, 343, 7, 28, 2, 2, 343, 344, 5, 34, 18, 2, 344, 345, 7, 29, 2, 2, 345, 380, 3, 2, 2, 2, 346, 347, 7, 65, 2, 2, 347, 348, 5, 34, 18, 2, 348, 349, 7, 10, 2, 2, 349, 354, 5, 34, 18, 2, 350, 351, 7, 10, 2, 2, 351, 353, 5, 34, 18, 2, 352, 350, 3, 2, 2, 2, 353, 356, 3, 2, 2, 2, 354, 352, 3, 2, 2, 2, 354, 355, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 357, 359, 7, 10, 2, 2, 358, 357, 3, 2, 2, 2, 358, 359, 3, 2, 2, 2, 359, 360, 3, 2, 2, 2, 360, 361, 7, 66, 2, 2, 361, 380, 3, 2, 2, 2, 362, 363, 7, 4, 2, 2, 363, 364, 5, 38, 20, 2, 364, 365, 7, 5, 2, 2, 365, 380, 3, 2, 2, 2, 366, 368, 5, 36, 19, 2, 367, 366, 3, 2, 2, 2, 368, 369, 3, 2, 2, 2, 369, 367, 3, 2, 2, 2, 369, 370, 3, 2, 2, 2, 370, 380, 3, 2, 2, 2, 371, 380, 7, 30, 2, 2, 372, 380, 7, 31, 2, 2, 373, 380, 7, 32, 2, 2, 374, 380, 5, 72, 37, 2, 375, 376, 7, 65, 2, 2, 376, 377, 5, 34, 18, 2, 377, 378, 7, 66, 2, 2, 378, 380, 3, 2, 2, 2, 379, 318, 3, 2, 2, 2, 379, 336, 3, 2, 2, 2, 379, 341, 3, 2, 2, 2, 379, 346, 3, 2, 2, 2, 379, 362, 3, 2, 2, 2, 379, 367, 3, 2, 2, 2, 379, 371, 3, 2, 2, 2, 379, 372, 3, 2, 2, 2, 379, 373, 3, 2, 2, 2, 379, 374, 3, 2, 2, 2, 379, 375, 3, 2, 2, 2, 380, 389, 3, 2, 2, 2, 381, 382, 12, 15, 2, 2, 382, 383, 7, 26, 2, 2, 383, 388, 5, 34, 18, 15, 384, 385, 12, 14, 2, 2, 385, 386, 7, 27, 2, 2, 386, 388, 5, 34, 18, 14, 387, 381, 3, 2, 2, 2, 387, 384, 3, 2, 2, 2, 388, 391, 3, 2, 2, 2, 389, 387, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 35, 3, 2, 2, 2, 391, 389, 3, 2, 2, 2, 392, 393, 7, 13, 2, 2, 393, 394, 7, 4, 2, 2, 394, 395, 5, 72, 37, 2, 395, 396, 7, 7, 2, 2, 396, 399, 7, 42, 2, 2, 397, 398, 7, 10, 2, 2, 398, 400, 5, 38, 20, 2, 399, 397, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 402, 3, 2, 2, 2, 401, 403, 7, 10, 2, 2, 402, 401, 3, 2, 2, 2, 402, 403, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 7, 5, 2, 2, 405, 37, 3, 2, 2, 2, 406, 407, 5, 40, 21, 2, 407, 408, 7, 7, 2, 2, 408, 409, 5, 34, 18, 2, 409, 410, 7, 10, 2, 2, 410, 412, 3, 2, 2, 2, 411, 406, 3, 2, 2, 2, 412, 415, 3, 2, 2, 2, 413, 411, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 425, 3, 2, 2, 2, 415, 413, 3, 2, 2, 2, 416, 417, 5, 40, 21, 2, 417, 418, 7, 7, 2, 2, 418, 419, 5, 34, 18, 2, 419, 423, 3, 2, 2, 2, 420, 424, 7, 10, 2, 2, 421, 422, 7, 13, 2, 2, 422, 424, 7, 67, 2, 2, 423, 420, 3, 2, 2, 2, 423, 421, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 426, 3, 2, 2, 2, 425, 416, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 430, 3, 2, 2, 2, 427, 428, 7, 13, 2, 2, 428, 430, 7, 67, 2, 2, 429, 413, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 430, 39, 3, 2, 2, 2, 431, 432, 5, 74, 38, 2, 432, 41, 3, 2, 2, 2, 433, 434, 8, 22, 1, 2, 434, 584, 5, 52, 27, 2, 435, 436, 5, 64, 33, 2, 436, 438, 7, 65, 2, 2, 437, 439, 5, 60, 31, 2, 438, 437, 3, 2, 2, 2, 438, 439, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 441, 7, 66, 2, 2, 441, 584, 3, 2, 2, 2, 442, 443, 7, 54, 2, 2, 443, 584, 5, 42, 22, 28, 444, 445, 5, 72, 37, 2, 445, 446, 7, 34, 2, 2, 446, 447, 7, 64, 2, 2, 447, 448, 5, 42, 22, 24, 448, 584, 3, 2, 2, 2, 449, 450, 7, 45, 2, 2, 450, 451, 7, 4, 2, 2, 451, 456, 5, 42, 22, 2, 452, 453, 7, 10, 2, 2, 453, 455, 5, 42, 22, 2, 454, 452, 3, 2, 2, 2, 455, 458, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 456, 3, 2, 2, 2, 459, 461, 7, 10, 2, 2, 460, 459, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 462, 3, 2, 2, 2, 462, 463, 7, 5, 2, 2, 463, 584, 3, 2, 2, 2, 464, 465, 7, 46, 2, 2, 465, 466, 7, 4, 2, 2, 466, 471, 5, 42, 22, 2, 467, 468, 7, 10, 2, 2, 468, 470, 5, 42, 22, 2, 469, 467, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 471, 472, 3, 2, 2, 2, 472, 475, 3, 2, 2, 2, 473, 471, 3, 2, 2, 2, 474, 476, 7, 10, 2, 2, 475, 474, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 477, 3, 2, 2, 2, 477, 478, 7, 5, 2, 2, 478, 584, 3, 2, 2, 2, 479, 584, 5, 44, 23, 2, 480, 481, 7, 35, 2, 2, 481, 482, 7, 4, 2, 2, 482, 487, 5, 42, 22, 2, 483, 484, 7, 10, 2, 2, 484, 486, 5, 42, 22, 2, 485, 483, 3, 2, 2, 2, 486, 489, 3, 2, 2, 2, 487, 485, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 491, 3, 2, 2, 2, 489, 487, 3, 2, 2, 2, 490, 492, 7, 10, 2, 2, 491, 490, 3, 2, 2, 2, 491, 492, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 494, 7, 5, 2, 2, 494, 584, 3, 2, 2, 2, 495, 496, 7, 36, 2, 2, 496, 497, 7, 4, 2, 2, 497, 502, 5, 42, 22, 2, 498, 499, 7, 10, 2, 2, 499, 501, 5, 42, 22, 2, 500, 498, 3, 2, 2, 2, 501, 504, 3, 2, 2, 2, 502, 500, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 506, 3, 2, 2, 2, 504, 502, 3, 2, 2, 2, 505, 507, 7, 10, 2, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 5, 2, 2, 509, 584, 3, 2, 2, 2, 510, 515, 5, 72, 37, 2, 511, 515, 7, 44, 2, 2, 512, 515, 7, 43, 2, 2, 513, 515, 7, 42, 2, 2, 514, 510, 3, 2, 2, 2, 514, 511, 3, 2, 2, 2, 514, 512, 3, 2, 2, 2, 514, 513, 3, 2, 2, 2, 515, 584, 3, 2, 2, 2, 516, 517, 7, 65, 2, 2, 517, 518, 5, 42, 22, 2, 518, 519, 7, 10, 2, 2, 519, 524, 5, 42, 22, 2, 520, 521, 7, 10, 2, 2, 521, 523, 5, 42, 22, 2, 522, 520, 3, 2, 2, 2, 523, 526, 3, 2, 2, 2, 524, 522, 3, 2, 2, 2, 524, 525, 3, 2, 2, 2, 525, 528, 3, 2, 2, 2, 526, 524, 3, 2, 2, 2, 527, 529, 7, 10, 2, 2, 528, 527, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 531, 7, 66, 2, 2, 531, 584, 3, 2, 2, 2, 532, 533, 7, 4, 2, 2, 533, 538, 5, 62, 32, 2, 534, 535, 7, 10, 2, 2, 535, 537, 5, 62, 32, 2, 536, 534, 3, 2, 2, 2, 537, 540, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 542, 3, 2, 2, 2, 540, 538, 3, 2, 2, 2, 541, 543, 7, 10, 2, 2, 542, 541, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 7, 5, 2, 2, 545, 584, 3, 2, 2, 2, 546, 555, 7, 28, 2, 2, 547, 552, 5, 42, 22, 2, 548, 549, 7, 10, 2, 2, 549, 551, 5, 42, 22, 2, 550, 548, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 556, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 547, 3, 2, 2, 2, 555, 556, 3, 2, 2, 2, 556, 558, 3, 2, 2, 2, 557, 559, 7, 10, 2, 2, 558, 557, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 584, 7, 29, 2, 2, 561, 562, 7, 37, 2, 2, 562, 563, 7, 65, 2, 2, 563, 564, 5, 42, 22, 2, 564, 565, 7, 66, 2, 2, 565, 566, 5, 42, 22, 2, 566, 567, 7, 38, 2, 2, 567, 568, 5, 42, 22, 7, 568, 584, 3, 2, 2, 2, 569, 570, 5, 10, 6, 2, 570, 571, 5, 42, 22, 6, 571, 584, 3, 2, 2, 2, 572, 573, 5, 16, 9, 2, 573, 574, 5, 42, 22, 5, 574, 584, 3, 2, 2, 2, 575, 576, 7, 65, 2, 2, 576, 577, 5, 42, 22, 2, 577, 578, 7, 66, 2, 2, 578, 584, 3, 2, 2, 2, 579, 580, 7, 4, 2, 2, 580, 581, 5, 42, 22, 2, 581, 582, 7, 5, 2, 2, 582, 584, 3, 2, 2, 2, 583, 433, 3, 2, 2, 2, 583, 435, 3, 2, 2, 2, 583, 442, 3, 2, 2, 2, 583, 444, 3, 2, 2, 2, 583, 449, 3, 2, 2, 2, 583, 464, 3, 2, 2, 2, 583, 479, 3, 2, 2, 2, 583, 480, 3, 2, 2, 2, 583, 495, 3, 2, 2, 2, 583, 514, 3, 2, 2, 2, 583, 516, 3, 2, 2, 2, 583, 532, 3, 2, 2, 2, 583, 546, 3, 2, 2, 2, 583, 561, 3, 2, 2, 2, 583, 569, 3, 2, 2, 2, 583, 572, 3, 2, 2, 2, 583, 575, 3, 2, 2, 2, 583, 579, 3, 2, 2, 2, 584, 647, 3, 2, 2, 2, 585, 586, 12, 29, 2, 2, 586, 587, 7, 33, 2, 2, 587, 646, 5, 42, 22, 29, 588, 589, 12, 27, 2, 2, 589, 590, 9, 2, 2, 2, 590, 646, 5, 42, 22, 28, 591, 592, 12, 26, 2, 2, 592, 593, 9, 3, 2, 2, 593, 646, 5, 42, 22, 27, 594, 595, 12, 25, 2, 2, 595, 596, 9, 4, 2, 2, 596, 646, 5, 42, 22, 26, 597, 598, 12, 23, 2, 2, 598, 599, 7, 64, 2, 2, 599, 600, 5, 42, 22, 24, 600, 601, 8, 22, 1, 2, 601, 646, 3, 2, 2, 2, 602, 603, 12, 21, 2, 2, 603, 604, 7, 45, 2, 2, 604, 646, 5, 42, 22, 22, 605, 606, 12, 19, 2, 2, 606, 607, 7, 46, 2, 2, 607, 646, 5, 42, 22, 20, 608, 609, 12, 18, 2, 2, 609, 610, 7, 47, 2, 2, 610, 646, 5, 42, 22, 19, 611, 612, 12, 17, 2, 2, 612, 613, 7, 48, 2, 2, 613, 646, 5, 42, 22, 18, 614, 615, 12, 10, 2, 2, 615, 616, 7, 26, 2, 2, 616, 646, 5, 42, 22, 11, 617, 618, 12, 33, 2, 2, 618, 619, 7, 22, 2, 2, 619, 625, 5, 66, 34, 2, 620, 622, 7, 65, 2, 2, 621, 623, 5, 60, 31, 2, 622, 621, 3, 2, 2, 2, 622, 623, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 626, 7, 66, 2, 2, 625, 620, 3, 2, 2, 2, 625, 626, 3, 2, 2, 2, 626, 646, 3, 2, 2, 2, 627, 628, 12, 30, 2, 2, 628, 629, 7, 28, 2, 2, 629, 630, 5, 42, 22, 2, 630, 631, 7, 29, 2, 2, 631, 646, 3, 2, 2, 2, 632, 633, 12, 15, 2, 2, 633, 641, 7, 52, 2, 2, 634, 635, 7, 13, 2, 2, 635, 636, 7, 42, 2, 2, 636, 637, 7, 7, 2, 2, 637, 638, 5, 56, 29, 2, 638, 639, 7, 27, 2, 2, 639, 640, 5, 42, 22, 2, 640, 642, 3, 2, 2, 2, 641, 634, 3, 2, 2, 2, 642, 643, 3, 2, 2, 2, 643, 641, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 646, 3, 2, 2, 2, 645, 585, 3, 2, 2, 2, 645, 588, 3, 2, 2, 2, 645, 591, 3, 2, 2, 2, 645, 594, 3, 2, 2, 2, 645, 597, 3, 2, 2, 2, 645, 602, 3, 2, 2, 2, 645, 605, 3, 2, 2, 2, 645, 608, 3, 2, 2, 2, 645, 611, 3, 2, 2, 2, 645, 614, 3, 2, 2, 2, 645, 617, 3, 2, 2, 2, 645, 627, 3, 2, 2, 2, 645, 632, 3, 2, 2, 2, 646, 649, 3, 2, 2, 2, 647, 645, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 43, 3, 2, 2, 2, 649, 647, 3, 2, 2, 2, 650, 651, 7, 52, 2, 2, 651, 652, 5, 42, 22, 2, 652, 654, 7, 4, 2, 2, 653, 655, 7, 13, 2, 2, 654, 653, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 656, 3, 2, 2, 2, 656, 661, 5, 46, 24, 2, 657, 658, 7, 13, 2, 2, 658, 660, 5, 46, 24, 2, 659, 657, 3, 2, 2, 2, 660, 663, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 664, 3, 2, 2, 2, 663, 661, 3, 2, 2, 2, 664, 665, 7, 5, 2, 2, 665, 45, 3, 2, 2, 2, 666, 669, 5, 48, 25, 2, 667, 669, 7, 39, 2, 2, 668, 666, 3, 2, 2, 2, 668, 667, 3, 2, 2, 2, 669, 670, 3, 2, 2, 2, 670, 671, 7, 27, 2, 2, 671, 672, 5, 42, 22, 2, 672, 47, 3, 2, 2, 2, 673, 680, 5, 74, 38, 2, 674, 677, 7, 65, 2, 2, 675, 678, 5, 74, 38, 2, 676, 678, 7, 39, 2, 2, 677, 675, 3, 2, 2, 2, 677, 676, 3, 2, 2, 2, 678, 679, 3, 2, 2, 2, 679, 681, 7, 66, 2, 2, 680, 674, 3, 2, 2, 2, 680, 681, 3, 2, 2, 2, 681, 49, 3, 2, 2, 2, 682, 683, 5, 8, 5, 2, 683, 684, 7, 2, 2, 3, 684, 692, 3, 2, 2, 2, 685, 686, 5, 42, 22, 2, 686, 687, 7, 2, 2, 3, 687, 692, 3, 2, 2, 2, 688, 689, 7, 68, 2, 2, 689, 692, 7, 2, 2, 3, 690, 692, 7, 2, 2, 3, 691, 682, 3, 2, 2, 2, 691, 685, 3, 2, 2, 2, 691, 688, 3, 2, 2, 2, 691, 690, 3, 2, 2, 2, 692, 51, 3, 2, 2, 2, 693, 694, 5, 56, 29, 2, 694, 695, 7, 27, 2, 2, 695, 696, 5, 42, 22, 2, 696, 711, 3, 2, 2, 2, 697, 698, 7, 65, 2, 2, 698, 703, 5, 56, 29, 2, 699, 700, 7, 10, 2, 2, 700, 702, 5, 56, 29, 2, 701, 699, 3, 2, 2, 2, 702, 705, 3, 2, 2, 2, 703, 701, 3, 2, 2, 2, 703, 704, 3, 2, 2, 2, 704, 706, 3, 2, 2, 2, 705, 703, 3, 2, 2, 2, 706, 707, 7, 66, 2, 2, 707, 708, 7, 27, 2, 2, 708, 709, 5, 42, 22, 2, 709, 711, 3, 2, 2, 2, 710, 693, 3, 2, 2, 2, 710, 697, 3, 2, 2, 2, 711, 53, 3, 2, 2, 2, 712, 715, 7, 39, 2, 2, 713, 715, 5, 72, 37, 2, 714, 712, 3, 2, 2, 2, 714, 713, 3, 2, 2, 2, 715, 55, 3, 2, 2, 2, 716, 717, 5, 54, 28, 2, 717, 57, 3, 2, 2, 2, 718, 721, 7, 55, 2, 2, 719, 721, 5, 72, 37, 2, 720, 718, 3, 2, 2, 2, 720, 719, 3, 2, 2, 2, 721, 59, 3, 2, 2, 2, 722, 727, 5, 42, 22, 2, 723, 724, 7, 10, 2, 2, 724, 726, 5, 42, 22, 2, 725, 723, 3, 2, 2, 2, 726, 729, 3, 2, 2, 2, 727, 725, 3, 2, 2, 2, 727, 728, 3, 2, 2, 2, 728, 61, 3, 2, 2, 2, 729, 727, 3, 2, 2, 2, 730, 731, 5, 74, 38, 2, 731, 732, 7, 7, 2, 2, 732, 733, 5, 42, 22, 2, 733, 737, 3, 2, 2, 2, 734, 735, 7, 40, 2, 2, 735, 737, 5, 42, 22, 2, 736, 730, 3, 2, 2, 2, 736, 734, 3, 2, 2, 2, 737, 63, 3, 2, 2, 2, 738, 741, 5, 72, 37, 2, 739, 741, 9, 5, 2, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 65, 3, 2, 2, 2, 742, 745, 5, 72, 37, 2, 743, 745, 9, 6, 2, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 67, 3, 2, 2, 2, 746, 747, 9, 7, 2, 2, 747, 69, 3, 2, 2, 2, 748, 749, 9, 8, 2, 2, 749, 71, 3, 2, 2, 2, 750, 755, 7, 67, 2, 2, 751, 752, 7, 41, 2, 2, 752, 754, 7, 67, 2, 2, 753, 751, 3, 2, 2, 2, 754, 757, 3, 2, 2, 2, 755, 753, 3, 2, 2, 2, 755, 756, 3, 2, 2, 2, 756, 73, 3, 2, 2, 2, 757, 755, 3, 2, 2, 2, 758, 763, 7, 67, 2, 2, 759, 760, 5, 72, 37, 2, 760, 761, 8, 38, 1, 2, 761, 763, 3, 2, 2, 2, 762, 758, 3, 2, 2, 2, 762, 759, 3, 2, 2, 2, 763, 75, 3, 2, 2, 2, 86, 79, 86, 95, 103, 128, 138, 141, 146, 161, 168, 172, 175, 188, 195, 198, 205, 211, 216, 227, 235, 241, 245, 247, 258, 260, 275, 283, 298, 306, 308, 325, 328, 331, 354, 358, 369, 379, 387, 389, 399, 402, 413, 423, 425, 429, 438, 456, 460, 471, 475, 487, 491, 502, 506, 514, 524, 528, 538, 542, 552, 555, 558, 583, 622, 625, 643, 645, 647, 654, 661, 668, 677, 680, 691, 703, 710, 714, 720, 727, 736, 740, 744, 755, 762] \ No newline at end of file diff --git a/quint/src/generated/QuintListener.ts b/quint/src/generated/QuintListener.ts index 3da7b4d67..6f6b292a1 100644 --- a/quint/src/generated/QuintListener.ts +++ b/quint/src/generated/QuintListener.ts @@ -41,6 +41,7 @@ import { OrExprContext } from "./QuintParser"; import { OrContext } from "./QuintParser"; import { IffContext } from "./QuintParser"; import { ImpliesContext } from "./QuintParser"; +import { MatchSumContext } from "./QuintParser"; import { MatchContext } from "./QuintParser"; import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; @@ -83,6 +84,9 @@ import { TypeUnionRecOneContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; +import { MatchSumExprContext } from "./QuintParser"; +import { MatchSumCaseContext } from "./QuintParser"; +import { MatchSumVariantContext } from "./QuintParser"; import { UnitOrExprContext } from "./QuintParser"; import { LambdaContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; @@ -519,6 +523,19 @@ export interface QuintListener extends ParseTreeListener { */ exitImplies?: (ctx: ImpliesContext) => void; + /** + * Enter a parse tree produced by the `matchSum` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + enterMatchSum?: (ctx: MatchSumContext) => void; + /** + * Exit a parse tree produced by the `matchSum` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + */ + exitMatchSum?: (ctx: MatchSumContext) => void; + /** * Enter a parse tree produced by the `match` * labeled alternative in `QuintParser.expr`. @@ -1023,6 +1040,39 @@ export interface QuintListener extends ParseTreeListener { */ exitExpr?: (ctx: ExprContext) => void; + /** + * Enter a parse tree produced by `QuintParser.matchSumExpr`. + * @param ctx the parse tree + */ + enterMatchSumExpr?: (ctx: MatchSumExprContext) => void; + /** + * Exit a parse tree produced by `QuintParser.matchSumExpr`. + * @param ctx the parse tree + */ + exitMatchSumExpr?: (ctx: MatchSumExprContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.matchSumCase`. + * @param ctx the parse tree + */ + enterMatchSumCase?: (ctx: MatchSumCaseContext) => void; + /** + * Exit a parse tree produced by `QuintParser.matchSumCase`. + * @param ctx the parse tree + */ + exitMatchSumCase?: (ctx: MatchSumCaseContext) => void; + + /** + * Enter a parse tree produced by `QuintParser.matchSumVariant`. + * @param ctx the parse tree + */ + enterMatchSumVariant?: (ctx: MatchSumVariantContext) => void; + /** + * Exit a parse tree produced by `QuintParser.matchSumVariant`. + * @param ctx the parse tree + */ + exitMatchSumVariant?: (ctx: MatchSumVariantContext) => void; + /** * Enter a parse tree produced by `QuintParser.unitOrExpr`. * @param ctx the parse tree diff --git a/quint/src/generated/QuintParser.ts b/quint/src/generated/QuintParser.ts index 1dc9097aa..219a283f3 100644 --- a/quint/src/generated/QuintParser.ts +++ b/quint/src/generated/QuintParser.ts @@ -124,27 +124,31 @@ export class QuintParser extends Parser { public static readonly RULE_row = 18; public static readonly RULE_rowLabel = 19; public static readonly RULE_expr = 20; - public static readonly RULE_unitOrExpr = 21; - public static readonly RULE_lambda = 22; - public static readonly RULE_identOrHole = 23; - public static readonly RULE_parameter = 24; - public static readonly RULE_identOrStar = 25; - public static readonly RULE_argList = 26; - public static readonly RULE_recElem = 27; - public static readonly RULE_normalCallName = 28; - public static readonly RULE_nameAfterDot = 29; - public static readonly RULE_operator = 30; - public static readonly RULE_literal = 31; - public static readonly RULE_qualId = 32; - public static readonly RULE_simpleId = 33; + public static readonly RULE_matchSumExpr = 21; + public static readonly RULE_matchSumCase = 22; + public static readonly RULE_matchSumVariant = 23; + public static readonly RULE_unitOrExpr = 24; + public static readonly RULE_lambda = 25; + public static readonly RULE_identOrHole = 26; + public static readonly RULE_parameter = 27; + public static readonly RULE_identOrStar = 28; + public static readonly RULE_argList = 29; + public static readonly RULE_recElem = 30; + public static readonly RULE_normalCallName = 31; + public static readonly RULE_nameAfterDot = 32; + public static readonly RULE_operator = 33; + public static readonly RULE_literal = 34; + public static readonly RULE_qualId = 35; + public static readonly RULE_simpleId = 36; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ "modules", "module", "documentedUnit", "unit", "operDef", "typeDef", "typeSumVariant", "nondetOperDef", "qualifier", "importMod", "exportMod", "instanceMod", "moduleName", "name", "qualifiedName", "fromSource", "type", "typeUnionRecOne", - "row", "rowLabel", "expr", "unitOrExpr", "lambda", "identOrHole", "parameter", - "identOrStar", "argList", "recElem", "normalCallName", "nameAfterDot", - "operator", "literal", "qualId", "simpleId", + "row", "rowLabel", "expr", "matchSumExpr", "matchSumCase", "matchSumVariant", + "unitOrExpr", "lambda", "identOrHole", "parameter", "identOrStar", "argList", + "recElem", "normalCallName", "nameAfterDot", "operator", "literal", "qualId", + "simpleId", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -203,21 +207,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 69; + this.state = 75; this._errHandler.sync(this); _la = this._input.LA(1); do { { { - this.state = 68; + this.state = 74; this.module(); } } - this.state = 71; + this.state = 77; this._errHandler.sync(this); _la = this._input.LA(1); } while (_la === QuintParser.T__0 || _la === QuintParser.DOCCOMMENT); - this.state = 73; + this.state = 79; this.match(QuintParser.EOF); } } @@ -243,41 +247,41 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 78; + this.state = 84; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 75; + this.state = 81; this.match(QuintParser.DOCCOMMENT); } } - this.state = 80; + this.state = 86; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 81; + this.state = 87; this.match(QuintParser.T__0); - this.state = 82; + this.state = 88; this.qualId(); - this.state = 83; + this.state = 89; this.match(QuintParser.T__1); - this.state = 87; + this.state = 93; this._errHandler.sync(this); _la = this._input.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__3) | (1 << QuintParser.T__5) | (1 << QuintParser.T__6) | (1 << QuintParser.T__9) | (1 << QuintParser.T__12) | (1 << QuintParser.T__13) | (1 << QuintParser.T__14) | (1 << QuintParser.T__15) | (1 << QuintParser.T__16) | (1 << QuintParser.T__17) | (1 << QuintParser.T__18) | (1 << QuintParser.T__22))) !== 0) || _la === QuintParser.DOCCOMMENT) { { { - this.state = 84; + this.state = 90; this.documentedUnit(); } } - this.state = 89; + this.state = 95; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 90; + this.state = 96; this.match(QuintParser.T__2); } } @@ -303,21 +307,21 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 95; + this.state = 101; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.DOCCOMMENT) { { { - this.state = 92; + this.state = 98; this.match(QuintParser.DOCCOMMENT); } } - this.state = 97; + this.state = 103; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 98; + this.state = 104; this.unit(); } } @@ -340,20 +344,20 @@ export class QuintParser extends Parser { let _localctx: UnitContext = new UnitContext(this._ctx, this.state); this.enterRule(_localctx, 6, QuintParser.RULE_unit); try { - this.state = 120; + this.state = 126; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 4, this._ctx) ) { case 1: _localctx = new ConstContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 100; + this.state = 106; this.match(QuintParser.T__3); - this.state = 101; + this.state = 107; this.qualId(); - this.state = 102; + this.state = 108; this.match(QuintParser.T__4); - this.state = 103; + this.state = 109; this.type(0); } break; @@ -362,13 +366,13 @@ export class QuintParser extends Parser { _localctx = new VarContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 105; + this.state = 111; this.match(QuintParser.T__5); - this.state = 106; + this.state = 112; this.qualId(); - this.state = 107; + this.state = 113; this.match(QuintParser.T__4); - this.state = 108; + this.state = 114; this.type(0); } break; @@ -377,13 +381,13 @@ export class QuintParser extends Parser { _localctx = new AssumeContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 110; + this.state = 116; this.match(QuintParser.T__6); - this.state = 111; + this.state = 117; this.identOrHole(); - this.state = 112; + this.state = 118; this.match(QuintParser.ASGN); - this.state = 113; + this.state = 119; this.expr(0); } break; @@ -392,7 +396,7 @@ export class QuintParser extends Parser { _localctx = new InstanceContext(_localctx); this.enterOuterAlt(_localctx, 4); { - this.state = 115; + this.state = 121; this.instanceMod(); } break; @@ -401,7 +405,7 @@ export class QuintParser extends Parser { _localctx = new OperContext(_localctx); this.enterOuterAlt(_localctx, 5); { - this.state = 116; + this.state = 122; this.operDef(); } break; @@ -410,7 +414,7 @@ export class QuintParser extends Parser { _localctx = new TypeDefsContext(_localctx); this.enterOuterAlt(_localctx, 6); { - this.state = 117; + this.state = 123; this.typeDef(); } break; @@ -419,7 +423,7 @@ export class QuintParser extends Parser { _localctx = new ImportDefContext(_localctx); this.enterOuterAlt(_localctx, 7); { - this.state = 118; + this.state = 124; this.importMod(); } break; @@ -428,7 +432,7 @@ export class QuintParser extends Parser { _localctx = new ExportDefContext(_localctx); this.enterOuterAlt(_localctx, 8); { - this.state = 119; + this.state = 125; this.exportMod(); } break; @@ -456,53 +460,53 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 122; + this.state = 128; this.qualifier(); - this.state = 123; + this.state = 129; this.normalCallName(); - this.state = 160; + this.state = 166; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 9, this._ctx) ) { case 1: { - this.state = 124; + this.state = 130; this.match(QuintParser.LPAREN); - this.state = 133; + this.state = 139; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__36 || _la === QuintParser.IDENTIFIER) { { - this.state = 125; + this.state = 131; this.parameter(); - this.state = 130; + this.state = 136; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 126; + this.state = 132; this.match(QuintParser.T__7); - this.state = 127; + this.state = 133; this.parameter(); } } - this.state = 132; + this.state = 138; this._errHandler.sync(this); _la = this._input.LA(1); } } } - this.state = 135; + this.state = 141; this.match(QuintParser.RPAREN); - this.state = 138; + this.state = 144; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 136; + this.state = 142; this.match(QuintParser.T__4); - this.state = 137; + this.state = 143; this.type(0); } } @@ -512,72 +516,72 @@ export class QuintParser extends Parser { case 2: { - this.state = 140; + this.state = 146; this.match(QuintParser.T__4); - this.state = 141; + this.state = 147; this.type(0); } break; case 3: { - this.state = 142; + this.state = 148; this.match(QuintParser.LPAREN); { - this.state = 143; + this.state = 149; this.parameter(); - this.state = 144; + this.state = 150; this.match(QuintParser.T__4); - this.state = 145; + this.state = 151; this.type(0); - this.state = 153; + this.state = 159; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 146; + this.state = 152; this.match(QuintParser.T__7); - this.state = 147; + this.state = 153; this.parameter(); - this.state = 148; + this.state = 154; this.match(QuintParser.T__4); - this.state = 149; + this.state = 155; this.type(0); } } - this.state = 155; + this.state = 161; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 156; + this.state = 162; this.match(QuintParser.RPAREN); - this.state = 157; + this.state = 163; this.match(QuintParser.T__4); - this.state = 158; + this.state = 164; this.type(0); } break; } - this.state = 164; + this.state = 170; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.ASGN) { { - this.state = 162; + this.state = 168; this.match(QuintParser.ASGN); - this.state = 163; + this.state = 169; this.expr(0); } } - this.state = 167; + this.state = 173; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 166; + this.state = 172; this.match(QuintParser.T__8); } } @@ -604,16 +608,16 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 10, QuintParser.RULE_typeDef); let _la: number; try { - this.state = 190; + this.state = 196; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 14, this._ctx) ) { case 1: _localctx = new TypeAbstractDefContext(_localctx); this.enterOuterAlt(_localctx, 1); { - this.state = 169; + this.state = 175; this.match(QuintParser.T__9); - this.state = 170; + this.state = 176; this.qualId(); } break; @@ -622,13 +626,13 @@ export class QuintParser extends Parser { _localctx = new TypeAliasDefContext(_localctx); this.enterOuterAlt(_localctx, 2); { - this.state = 171; + this.state = 177; this.match(QuintParser.T__9); - this.state = 172; + this.state = 178; this.qualId(); - this.state = 173; + this.state = 179; this.match(QuintParser.ASGN); - this.state = 174; + this.state = 180; this.type(0); } break; @@ -637,37 +641,37 @@ export class QuintParser extends Parser { _localctx = new TypeSumDefContext(_localctx); this.enterOuterAlt(_localctx, 3); { - this.state = 176; + this.state = 182; this.match(QuintParser.T__9); - this.state = 177; + this.state = 183; (_localctx as TypeSumDefContext)._typeName = this.qualId(); - this.state = 178; + this.state = 184; this.match(QuintParser.ASGN); - this.state = 180; + this.state = 186; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__10) { { - this.state = 179; + this.state = 185; this.match(QuintParser.T__10); } } - this.state = 182; + this.state = 188; this.typeSumVariant(); - this.state = 187; + this.state = 193; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__10) { { { - this.state = 183; + this.state = 189; this.match(QuintParser.T__10); - this.state = 184; + this.state = 190; this.typeSumVariant(); } } - this.state = 189; + this.state = 195; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -697,18 +701,18 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 192; + this.state = 198; _localctx._sumLabel = this.simpleId("variant label"); - this.state = 197; + this.state = 203; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.LPAREN) { { - this.state = 193; + this.state = 199; this.match(QuintParser.LPAREN); - this.state = 194; + this.state = 200; this.type(0); - this.state = 195; + this.state = 201; this.match(QuintParser.RPAREN); } } @@ -737,32 +741,32 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 199; + this.state = 205; this.match(QuintParser.T__11); - this.state = 200; + this.state = 206; this.qualId(); - this.state = 203; + this.state = 209; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__4) { { - this.state = 201; + this.state = 207; this.match(QuintParser.T__4); - this.state = 202; + this.state = 208; this.type(0); } } - this.state = 205; + this.state = 211; this.match(QuintParser.ASGN); - this.state = 206; + this.state = 212; this.expr(0); - this.state = 208; + this.state = 214; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__8) { { - this.state = 207; + this.state = 213; this.match(QuintParser.T__8); } } @@ -788,13 +792,13 @@ export class QuintParser extends Parser { let _localctx: QualifierContext = new QualifierContext(this._ctx, this.state); this.enterRule(_localctx, 16, QuintParser.RULE_qualifier); try { - this.state = 219; + this.state = 225; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 18, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 210; + this.state = 216; this.match(QuintParser.T__12); } break; @@ -802,7 +806,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 211; + this.state = 217; this.match(QuintParser.T__13); } break; @@ -810,9 +814,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 212; + this.state = 218; this.match(QuintParser.T__14); - this.state = 213; + this.state = 219; this.match(QuintParser.T__12); } break; @@ -820,9 +824,9 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 214; + this.state = 220; this.match(QuintParser.T__14); - this.state = 215; + this.state = 221; this.match(QuintParser.T__13); } break; @@ -830,7 +834,7 @@ export class QuintParser extends Parser { case 5: this.enterOuterAlt(_localctx, 5); { - this.state = 216; + this.state = 222; this.match(QuintParser.T__15); } break; @@ -838,7 +842,7 @@ export class QuintParser extends Parser { case 6: this.enterOuterAlt(_localctx, 6); { - this.state = 217; + this.state = 223; this.match(QuintParser.T__16); } break; @@ -846,7 +850,7 @@ export class QuintParser extends Parser { case 7: this.enterOuterAlt(_localctx, 7); { - this.state = 218; + this.state = 224; this.match(QuintParser.T__17); } break; @@ -872,28 +876,28 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 18, QuintParser.RULE_importMod); let _la: number; try { - this.state = 239; + this.state = 245; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 22, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 221; + this.state = 227; this.match(QuintParser.T__18); - this.state = 222; + this.state = 228; this.name(); - this.state = 223; + this.state = 229; this.match(QuintParser.T__19); - this.state = 224; + this.state = 230; this.identOrStar(); - this.state = 227; + this.state = 233; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 225; + this.state = 231; this.match(QuintParser.T__20); - this.state = 226; + this.state = 232; this.fromSource(); } } @@ -904,30 +908,30 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 229; + this.state = 235; this.match(QuintParser.T__18); - this.state = 230; + this.state = 236; this.name(); - this.state = 233; + this.state = 239; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__21) { { - this.state = 231; + this.state = 237; this.match(QuintParser.T__21); - this.state = 232; + this.state = 238; this.name(); } } - this.state = 237; + this.state = 243; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 235; + this.state = 241; this.match(QuintParser.T__20); - this.state = 236; + this.state = 242; this.fromSource(); } } @@ -956,19 +960,19 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 20, QuintParser.RULE_exportMod); let _la: number; try { - this.state = 252; + this.state = 258; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 24, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 241; + this.state = 247; this.match(QuintParser.T__22); - this.state = 242; + this.state = 248; this.name(); - this.state = 243; + this.state = 249; this.match(QuintParser.T__19); - this.state = 244; + this.state = 250; this.identOrStar(); } break; @@ -976,18 +980,18 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 246; + this.state = 252; this.match(QuintParser.T__22); - this.state = 247; + this.state = 253; this.name(); - this.state = 250; + this.state = 256; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__21) { { - this.state = 248; + this.state = 254; this.match(QuintParser.T__21); - this.state = 249; + this.state = 255; this.name(); } } @@ -1016,60 +1020,60 @@ export class QuintParser extends Parser { this.enterRule(_localctx, 22, QuintParser.RULE_instanceMod); let _la: number; try { - this.state = 300; + this.state = 306; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 29, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 254; + this.state = 260; this.match(QuintParser.T__18); - this.state = 255; + this.state = 261; this.moduleName(); - this.state = 256; + this.state = 262; this.match(QuintParser.LPAREN); { - this.state = 257; + this.state = 263; this.name(); - this.state = 258; + this.state = 264; this.match(QuintParser.ASGN); - this.state = 259; + this.state = 265; this.expr(0); - this.state = 267; + this.state = 273; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 260; + this.state = 266; this.match(QuintParser.T__7); - this.state = 261; + this.state = 267; this.name(); - this.state = 262; + this.state = 268; this.match(QuintParser.ASGN); - this.state = 263; + this.state = 269; this.expr(0); } } - this.state = 269; + this.state = 275; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 270; + this.state = 276; this.match(QuintParser.RPAREN); - this.state = 271; + this.state = 277; this.match(QuintParser.T__19); - this.state = 272; + this.state = 278; this.match(QuintParser.MUL); - this.state = 275; + this.state = 281; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 273; + this.state = 279; this.match(QuintParser.T__20); - this.state = 274; + this.state = 280; this.fromSource(); } } @@ -1080,54 +1084,54 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 277; + this.state = 283; this.match(QuintParser.T__18); - this.state = 278; + this.state = 284; this.moduleName(); - this.state = 279; + this.state = 285; this.match(QuintParser.LPAREN); { - this.state = 280; + this.state = 286; this.name(); - this.state = 281; + this.state = 287; this.match(QuintParser.ASGN); - this.state = 282; + this.state = 288; this.expr(0); - this.state = 290; + this.state = 296; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 283; + this.state = 289; this.match(QuintParser.T__7); - this.state = 284; + this.state = 290; this.name(); - this.state = 285; + this.state = 291; this.match(QuintParser.ASGN); - this.state = 286; + this.state = 292; this.expr(0); } } - this.state = 292; + this.state = 298; this._errHandler.sync(this); _la = this._input.LA(1); } } - this.state = 293; + this.state = 299; this.match(QuintParser.RPAREN); - this.state = 294; + this.state = 300; this.match(QuintParser.T__21); - this.state = 295; + this.state = 301; this.qualifiedName(); - this.state = 298; + this.state = 304; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__20) { { - this.state = 296; + this.state = 302; this.match(QuintParser.T__20); - this.state = 297; + this.state = 303; this.fromSource(); } } @@ -1157,7 +1161,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 302; + this.state = 308; this.qualId(); } } @@ -1182,7 +1186,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 304; + this.state = 310; this.qualId(); } } @@ -1207,7 +1211,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 306; + this.state = 312; this.qualId(); } } @@ -1232,7 +1236,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 308; + this.state = 314; this.match(QuintParser.STRING); } } @@ -1270,7 +1274,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 371; + this.state = 377; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 36, this._ctx) ) { case 1: @@ -1279,51 +1283,51 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 311; + this.state = 317; this.match(QuintParser.LPAREN); - this.state = 320; + this.state = 326; this._errHandler.sync(this); _la = this._input.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & ((1 << QuintParser.T__1) | (1 << QuintParser.T__10) | (1 << QuintParser.T__27) | (1 << QuintParser.T__28) | (1 << QuintParser.T__29))) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & ((1 << (QuintParser.SET - 47)) | (1 << (QuintParser.LIST - 47)) | (1 << (QuintParser.LPAREN - 47)) | (1 << (QuintParser.IDENTIFIER - 47)))) !== 0)) { { - this.state = 312; + this.state = 318; this.type(0); - this.state = 317; + this.state = 323; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 313; + this.state = 319; this.match(QuintParser.T__7); - this.state = 314; + this.state = 320; this.type(0); } } } - this.state = 319; + this.state = 325; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 30, this._ctx); } } } - this.state = 323; + this.state = 329; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 322; + this.state = 328; this.match(QuintParser.T__7); } } - this.state = 325; + this.state = 331; this.match(QuintParser.RPAREN); - this.state = 326; + this.state = 332; this.match(QuintParser.T__24); - this.state = 327; + this.state = 333; this.type(11); } break; @@ -1333,13 +1337,13 @@ export class QuintParser extends Parser { _localctx = new TypeSetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 328; + this.state = 334; this.match(QuintParser.SET); - this.state = 329; + this.state = 335; this.match(QuintParser.T__25); - this.state = 330; + this.state = 336; this.type(0); - this.state = 331; + this.state = 337; this.match(QuintParser.T__26); } break; @@ -1349,13 +1353,13 @@ export class QuintParser extends Parser { _localctx = new TypeListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 333; + this.state = 339; this.match(QuintParser.LIST); - this.state = 334; + this.state = 340; this.match(QuintParser.T__25); - this.state = 335; + this.state = 341; this.type(0); - this.state = 336; + this.state = 342; this.match(QuintParser.T__26); } break; @@ -1365,43 +1369,43 @@ export class QuintParser extends Parser { _localctx = new TypeTupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 338; + this.state = 344; this.match(QuintParser.LPAREN); - this.state = 339; + this.state = 345; this.type(0); - this.state = 340; + this.state = 346; this.match(QuintParser.T__7); - this.state = 341; + this.state = 347; this.type(0); - this.state = 346; + this.state = 352; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 342; + this.state = 348; this.match(QuintParser.T__7); - this.state = 343; + this.state = 349; this.type(0); } } } - this.state = 348; + this.state = 354; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 33, this._ctx); } - this.state = 350; + this.state = 356; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 349; + this.state = 355; this.match(QuintParser.T__7); } } - this.state = 352; + this.state = 358; this.match(QuintParser.RPAREN); } break; @@ -1411,11 +1415,11 @@ export class QuintParser extends Parser { _localctx = new TypeRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 354; + this.state = 360; this.match(QuintParser.T__1); - this.state = 355; + this.state = 361; this.row(); - this.state = 356; + this.state = 362; this.match(QuintParser.T__2); } break; @@ -1425,7 +1429,7 @@ export class QuintParser extends Parser { _localctx = new TypeUnionRecContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 359; + this.state = 365; this._errHandler.sync(this); _alt = 1; do { @@ -1433,7 +1437,7 @@ export class QuintParser extends Parser { case 1: { { - this.state = 358; + this.state = 364; this.typeUnionRecOne(); } } @@ -1441,7 +1445,7 @@ export class QuintParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 361; + this.state = 367; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 35, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); @@ -1453,7 +1457,7 @@ export class QuintParser extends Parser { _localctx = new TypeIntContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 363; + this.state = 369; this.match(QuintParser.T__27); } break; @@ -1463,7 +1467,7 @@ export class QuintParser extends Parser { _localctx = new TypeStrContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 364; + this.state = 370; this.match(QuintParser.T__28); } break; @@ -1473,7 +1477,7 @@ export class QuintParser extends Parser { _localctx = new TypeBoolContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 365; + this.state = 371; this.match(QuintParser.T__29); } break; @@ -1483,7 +1487,7 @@ export class QuintParser extends Parser { _localctx = new TypeConstOrVarContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 366; + this.state = 372; this.qualId(); } break; @@ -1493,17 +1497,17 @@ export class QuintParser extends Parser { _localctx = new TypeParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 367; + this.state = 373; this.match(QuintParser.LPAREN); - this.state = 368; + this.state = 374; this.type(0); - this.state = 369; + this.state = 375; this.match(QuintParser.RPAREN); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 381; + this.state = 387; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1513,20 +1517,20 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 379; + this.state = 385; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 37, this._ctx) ) { case 1: { _localctx = new TypeFunContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 373; + this.state = 379; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 374; + this.state = 380; this.match(QuintParser.T__23); - this.state = 375; + this.state = 381; this.type(13); } break; @@ -1535,20 +1539,20 @@ export class QuintParser extends Parser { { _localctx = new TypeOperContext(new TypeContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_type); - this.state = 376; + this.state = 382; if (!(this.precpred(this._ctx, 12))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 12)"); } - this.state = 377; + this.state = 383; this.match(QuintParser.T__24); - this.state = 378; + this.state = 384; this.type(12); } break; } } } - this.state = 383; + this.state = 389; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 38, this._ctx); } @@ -1576,39 +1580,39 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 384; + this.state = 390; this.match(QuintParser.T__10); - this.state = 385; + this.state = 391; this.match(QuintParser.T__1); - this.state = 386; + this.state = 392; this.qualId(); - this.state = 387; + this.state = 393; this.match(QuintParser.T__4); - this.state = 388; + this.state = 394; this.match(QuintParser.STRING); - this.state = 391; + this.state = 397; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 39, this._ctx) ) { case 1: { - this.state = 389; + this.state = 395; this.match(QuintParser.T__7); - this.state = 390; + this.state = 396; this.row(); } break; } - this.state = 394; + this.state = 400; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 393; + this.state = 399; this.match(QuintParser.T__7); } } - this.state = 396; + this.state = 402; this.match(QuintParser.T__2); } } @@ -1633,7 +1637,7 @@ export class QuintParser extends Parser { let _la: number; try { let _alt: number; - this.state = 421; + this.state = 427; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__2: @@ -1641,57 +1645,57 @@ export class QuintParser extends Parser { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 405; + this.state = 411; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 398; + this.state = 404; this.rowLabel(); - this.state = 399; + this.state = 405; this.match(QuintParser.T__4); - this.state = 400; + this.state = 406; this.type(0); - this.state = 401; + this.state = 407; this.match(QuintParser.T__7); } } } - this.state = 407; + this.state = 413; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 41, this._ctx); } - this.state = 417; + this.state = 423; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.IDENTIFIER) { { { - this.state = 408; + this.state = 414; this.rowLabel(); - this.state = 409; + this.state = 415; this.match(QuintParser.T__4); - this.state = 410; + this.state = 416; this.type(0); } - this.state = 415; + this.state = 421; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { - this.state = 412; + this.state = 418; this.match(QuintParser.T__7); } break; case 2: { - this.state = 413; + this.state = 419; this.match(QuintParser.T__10); { - this.state = 414; + this.state = 420; _localctx._rowVar = this.match(QuintParser.IDENTIFIER); } } @@ -1705,10 +1709,10 @@ export class QuintParser extends Parser { case QuintParser.T__10: this.enterOuterAlt(_localctx, 2); { - this.state = 419; + this.state = 425; this.match(QuintParser.T__10); { - this.state = 420; + this.state = 426; _localctx._rowVar = this.match(QuintParser.IDENTIFIER); } } @@ -1738,7 +1742,7 @@ export class QuintParser extends Parser { try { this.enterOuterAlt(_localctx, 1); { - this.state = 423; + this.state = 429; this.simpleId("record"); } } @@ -1776,7 +1780,7 @@ export class QuintParser extends Parser { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 574; + this.state = 581; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 62, this._ctx) ) { case 1: @@ -1785,7 +1789,7 @@ export class QuintParser extends Parser { this._ctx = _localctx; _prevctx = _localctx; - this.state = 426; + this.state = 432; this.lambda(); } break; @@ -1795,21 +1799,21 @@ export class QuintParser extends Parser { _localctx = new OperAppContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 427; + this.state = 433; this.normalCallName(); - this.state = 428; + this.state = 434; this.match(QuintParser.LPAREN); - this.state = 430; + this.state = 436; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { { - this.state = 429; + this.state = 435; this.argList(); } } - this.state = 432; + this.state = 438; this.match(QuintParser.RPAREN); } break; @@ -1819,10 +1823,10 @@ export class QuintParser extends Parser { _localctx = new UminusContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 434; + this.state = 440; this.match(QuintParser.MINUS); - this.state = 435; - this.expr(25); + this.state = 441; + this.expr(26); } break; @@ -1831,14 +1835,14 @@ export class QuintParser extends Parser { _localctx = new AsgnContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 436; + this.state = 442; this.qualId(); - this.state = 437; + this.state = 443; this.match(QuintParser.T__31); - this.state = 438; + this.state = 444; this.match(QuintParser.ASGN); - this.state = 439; - this.expr(21); + this.state = 445; + this.expr(22); } break; @@ -1847,41 +1851,41 @@ export class QuintParser extends Parser { _localctx = new AndExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 441; + this.state = 447; this.match(QuintParser.AND); - this.state = 442; + this.state = 448; this.match(QuintParser.T__1); - this.state = 443; + this.state = 449; this.expr(0); - this.state = 448; + this.state = 454; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 444; + this.state = 450; this.match(QuintParser.T__7); - this.state = 445; + this.state = 451; this.expr(0); } } } - this.state = 450; + this.state = 456; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 46, this._ctx); } - this.state = 452; + this.state = 458; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 451; + this.state = 457; this.match(QuintParser.T__7); } } - this.state = 454; + this.state = 460; this.match(QuintParser.T__2); } break; @@ -1891,162 +1895,172 @@ export class QuintParser extends Parser { _localctx = new OrExprContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 456; + this.state = 462; this.match(QuintParser.OR); - this.state = 457; + this.state = 463; this.match(QuintParser.T__1); - this.state = 458; + this.state = 464; this.expr(0); - this.state = 463; + this.state = 469; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 459; + this.state = 465; this.match(QuintParser.T__7); - this.state = 460; + this.state = 466; this.expr(0); } } } - this.state = 465; + this.state = 471; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 48, this._ctx); } - this.state = 467; + this.state = 473; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 466; + this.state = 472; this.match(QuintParser.T__7); } } - this.state = 469; + this.state = 475; this.match(QuintParser.T__2); } break; case 7: + { + _localctx = new MatchSumContext(_localctx); + this._ctx = _localctx; + _prevctx = _localctx; + this.state = 477; + this.matchSumExpr(); + } + break; + + case 8: { _localctx = new ActionAllContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 471; + this.state = 478; this.match(QuintParser.T__32); - this.state = 472; + this.state = 479; this.match(QuintParser.T__1); - this.state = 473; + this.state = 480; this.expr(0); - this.state = 478; + this.state = 485; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 474; + this.state = 481; this.match(QuintParser.T__7); - this.state = 475; + this.state = 482; this.expr(0); } } } - this.state = 480; + this.state = 487; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 50, this._ctx); } - this.state = 482; + this.state = 489; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 481; + this.state = 488; this.match(QuintParser.T__7); } } - this.state = 484; + this.state = 491; this.match(QuintParser.T__2); } break; - case 8: + case 9: { _localctx = new ActionAnyContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 486; + this.state = 493; this.match(QuintParser.T__33); - this.state = 487; + this.state = 494; this.match(QuintParser.T__1); - this.state = 488; + this.state = 495; this.expr(0); - this.state = 493; + this.state = 500; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 489; + this.state = 496; this.match(QuintParser.T__7); - this.state = 490; + this.state = 497; this.expr(0); } } } - this.state = 495; + this.state = 502; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 52, this._ctx); } - this.state = 497; + this.state = 504; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 496; + this.state = 503; this.match(QuintParser.T__7); } } - this.state = 499; + this.state = 506; this.match(QuintParser.T__2); } break; - case 9: + case 10: { _localctx = new LiteralOrIdContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 505; + this.state = 512; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: { - this.state = 501; + this.state = 508; this.qualId(); } break; case QuintParser.INT: { - this.state = 502; + this.state = 509; this.match(QuintParser.INT); } break; case QuintParser.BOOL: { - this.state = 503; + this.state = 510; this.match(QuintParser.BOOL); } break; case QuintParser.STRING: { - this.state = 504; + this.state = 511; this.match(QuintParser.STRING); } break; @@ -2056,220 +2070,220 @@ export class QuintParser extends Parser { } break; - case 10: + case 11: { _localctx = new TupleContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 507; + this.state = 514; this.match(QuintParser.LPAREN); - this.state = 508; + this.state = 515; this.expr(0); - this.state = 509; + this.state = 516; this.match(QuintParser.T__7); - this.state = 510; + this.state = 517; this.expr(0); - this.state = 515; + this.state = 522; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 511; + this.state = 518; this.match(QuintParser.T__7); - this.state = 512; + this.state = 519; this.expr(0); } } } - this.state = 517; + this.state = 524; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 55, this._ctx); } - this.state = 519; + this.state = 526; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 518; + this.state = 525; this.match(QuintParser.T__7); } } - this.state = 521; + this.state = 528; this.match(QuintParser.RPAREN); } break; - case 11: + case 12: { _localctx = new RecordContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 523; + this.state = 530; this.match(QuintParser.T__1); - this.state = 524; + this.state = 531; this.recElem(); - this.state = 529; + this.state = 536; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 525; + this.state = 532; this.match(QuintParser.T__7); - this.state = 526; + this.state = 533; this.recElem(); } } } - this.state = 531; + this.state = 538; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 57, this._ctx); } - this.state = 533; + this.state = 540; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 532; + this.state = 539; this.match(QuintParser.T__7); } } - this.state = 535; + this.state = 542; this.match(QuintParser.T__2); } break; - case 12: + case 13: { _localctx = new ListContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 537; + this.state = 544; this.match(QuintParser.T__25); - this.state = 546; + this.state = 553; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { { - this.state = 538; + this.state = 545; this.expr(0); - this.state = 543; + this.state = 550; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 539; + this.state = 546; this.match(QuintParser.T__7); - this.state = 540; + this.state = 547; this.expr(0); } } } - this.state = 545; + this.state = 552; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 59, this._ctx); } } } - this.state = 549; + this.state = 556; this._errHandler.sync(this); _la = this._input.LA(1); if (_la === QuintParser.T__7) { { - this.state = 548; + this.state = 555; this.match(QuintParser.T__7); } } - this.state = 551; + this.state = 558; this.match(QuintParser.T__26); } break; - case 13: + case 14: { _localctx = new IfElseContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 552; + this.state = 559; this.match(QuintParser.T__34); - this.state = 553; + this.state = 560; this.match(QuintParser.LPAREN); - this.state = 554; + this.state = 561; this.expr(0); - this.state = 555; + this.state = 562; this.match(QuintParser.RPAREN); - this.state = 556; + this.state = 563; this.expr(0); - this.state = 557; + this.state = 564; this.match(QuintParser.T__35); - this.state = 558; + this.state = 565; this.expr(5); } break; - case 14: + case 15: { _localctx = new LetInContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 560; + this.state = 567; this.operDef(); - this.state = 561; + this.state = 568; this.expr(4); } break; - case 15: + case 16: { _localctx = new NondetContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 563; + this.state = 570; this.nondetOperDef(); - this.state = 564; + this.state = 571; this.expr(3); } break; - case 16: + case 17: { _localctx = new ParenContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 566; + this.state = 573; this.match(QuintParser.LPAREN); - this.state = 567; + this.state = 574; this.expr(0); - this.state = 568; + this.state = 575; this.match(QuintParser.RPAREN); } break; - case 17: + case 18: { _localctx = new BracesContext(_localctx); this._ctx = _localctx; _prevctx = _localctx; - this.state = 570; + this.state = 577; this.match(QuintParser.T__1); - this.state = 571; + this.state = 578; this.expr(0); - this.state = 572; + this.state = 579; this.match(QuintParser.T__2); } break; } this._ctx._stop = this._input.tryLT(-1); - this.state = 638; + this.state = 645; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -2279,21 +2293,21 @@ export class QuintParser extends Parser { } _prevctx = _localctx; { - this.state = 636; + this.state = 643; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 66, this._ctx) ) { case 1: { _localctx = new PowContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 576; - if (!(this.precpred(this._ctx, 26))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 26)"); + this.state = 583; + if (!(this.precpred(this._ctx, 27))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); } - this.state = 577; + this.state = 584; (_localctx as PowContext)._op = this.match(QuintParser.T__30); - this.state = 578; - this.expr(26); + this.state = 585; + this.expr(27); } break; @@ -2301,11 +2315,11 @@ export class QuintParser extends Parser { { _localctx = new MultDivContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 579; - if (!(this.precpred(this._ctx, 24))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); + this.state = 586; + if (!(this.precpred(this._ctx, 25))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 25)"); } - this.state = 580; + this.state = 587; (_localctx as MultDivContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & ((1 << (QuintParser.MUL - 53)) | (1 << (QuintParser.DIV - 53)) | (1 << (QuintParser.MOD - 53)))) !== 0))) { @@ -2318,8 +2332,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 581; - this.expr(25); + this.state = 588; + this.expr(26); } break; @@ -2327,11 +2341,11 @@ export class QuintParser extends Parser { { _localctx = new PlusMinusContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 582; - if (!(this.precpred(this._ctx, 23))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); + this.state = 589; + if (!(this.precpred(this._ctx, 24))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 24)"); } - this.state = 583; + this.state = 590; (_localctx as PlusMinusContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(_la === QuintParser.PLUS || _la === QuintParser.MINUS)) { @@ -2344,8 +2358,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 584; - this.expr(24); + this.state = 591; + this.expr(25); } break; @@ -2353,11 +2367,11 @@ export class QuintParser extends Parser { { _localctx = new RelationsContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 585; - if (!(this.precpred(this._ctx, 22))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 22)"); + this.state = 592; + if (!(this.precpred(this._ctx, 23))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 23)"); } - this.state = 586; + this.state = 593; (_localctx as RelationsContext)._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & ((1 << (QuintParser.GT - 56)) | (1 << (QuintParser.LT - 56)) | (1 << (QuintParser.GE - 56)) | (1 << (QuintParser.LE - 56)) | (1 << (QuintParser.NE - 56)) | (1 << (QuintParser.EQ - 56)))) !== 0))) { @@ -2370,8 +2384,8 @@ export class QuintParser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 587; - this.expr(23); + this.state = 594; + this.expr(24); } break; @@ -2379,14 +2393,14 @@ export class QuintParser extends Parser { { _localctx = new ErrorEqContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 588; - if (!(this.precpred(this._ctx, 20))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 20)"); + this.state = 595; + if (!(this.precpred(this._ctx, 21))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 21)"); } - this.state = 589; + this.state = 596; this.match(QuintParser.ASGN); - this.state = 590; - this.expr(21); + this.state = 597; + this.expr(22); const m = "QNT006: unexpected '=', did you mean '=='?" this.notifyErrorListeners(m) @@ -2398,14 +2412,14 @@ export class QuintParser extends Parser { { _localctx = new AndContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 593; - if (!(this.precpred(this._ctx, 18))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 18)"); + this.state = 600; + if (!(this.precpred(this._ctx, 19))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 19)"); } - this.state = 594; + this.state = 601; this.match(QuintParser.AND); - this.state = 595; - this.expr(19); + this.state = 602; + this.expr(20); } break; @@ -2413,14 +2427,14 @@ export class QuintParser extends Parser { { _localctx = new OrContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 596; - if (!(this.precpred(this._ctx, 16))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); + this.state = 603; + if (!(this.precpred(this._ctx, 17))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 17)"); } - this.state = 597; + this.state = 604; this.match(QuintParser.OR); - this.state = 598; - this.expr(17); + this.state = 605; + this.expr(18); } break; @@ -2428,14 +2442,14 @@ export class QuintParser extends Parser { { _localctx = new IffContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 599; - if (!(this.precpred(this._ctx, 15))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); + this.state = 606; + if (!(this.precpred(this._ctx, 16))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 16)"); } - this.state = 600; + this.state = 607; this.match(QuintParser.IFF); - this.state = 601; - this.expr(16); + this.state = 608; + this.expr(17); } break; @@ -2443,14 +2457,14 @@ export class QuintParser extends Parser { { _localctx = new ImpliesContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 602; - if (!(this.precpred(this._ctx, 14))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 14)"); + this.state = 609; + if (!(this.precpred(this._ctx, 15))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 15)"); } - this.state = 603; + this.state = 610; this.match(QuintParser.IMPLIES); - this.state = 604; - this.expr(15); + this.state = 611; + this.expr(16); } break; @@ -2458,13 +2472,13 @@ export class QuintParser extends Parser { { _localctx = new PairContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 605; + this.state = 612; if (!(this.precpred(this._ctx, 8))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 8)"); } - this.state = 606; + this.state = 613; this.match(QuintParser.T__23); - this.state = 607; + this.state = 614; this.expr(9); } break; @@ -2473,32 +2487,32 @@ export class QuintParser extends Parser { { _localctx = new DotCallContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 608; - if (!(this.precpred(this._ctx, 30))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 30)"); + this.state = 615; + if (!(this.precpred(this._ctx, 31))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 31)"); } - this.state = 609; + this.state = 616; this.match(QuintParser.T__19); - this.state = 610; + this.state = 617; this.nameAfterDot(); - this.state = 616; + this.state = 623; this._errHandler.sync(this); switch ( this.interpreter.adaptivePredict(this._input, 64, this._ctx) ) { case 1: { - this.state = 611; + this.state = 618; this.match(QuintParser.LPAREN); - this.state = 613; + this.state = 620; this._errHandler.sync(this); _la = this._input.LA(1); - if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { + if (((((_la - 2)) & ~0x1F) === 0 && ((1 << (_la - 2)) & ((1 << (QuintParser.T__1 - 2)) | (1 << (QuintParser.T__11 - 2)) | (1 << (QuintParser.T__12 - 2)) | (1 << (QuintParser.T__13 - 2)) | (1 << (QuintParser.T__14 - 2)) | (1 << (QuintParser.T__15 - 2)) | (1 << (QuintParser.T__16 - 2)) | (1 << (QuintParser.T__17 - 2)) | (1 << (QuintParser.T__25 - 2)) | (1 << (QuintParser.T__32 - 2)))) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & ((1 << (QuintParser.T__33 - 34)) | (1 << (QuintParser.T__34 - 34)) | (1 << (QuintParser.T__36 - 34)) | (1 << (QuintParser.STRING - 34)) | (1 << (QuintParser.BOOL - 34)) | (1 << (QuintParser.INT - 34)) | (1 << (QuintParser.AND - 34)) | (1 << (QuintParser.OR - 34)) | (1 << (QuintParser.IFF - 34)) | (1 << (QuintParser.IMPLIES - 34)) | (1 << (QuintParser.SET - 34)) | (1 << (QuintParser.LIST - 34)) | (1 << (QuintParser.MAP - 34)) | (1 << (QuintParser.MATCH - 34)) | (1 << (QuintParser.MINUS - 34)) | (1 << (QuintParser.LPAREN - 34)) | (1 << (QuintParser.IDENTIFIER - 34)))) !== 0)) { { - this.state = 612; + this.state = 619; this.argList(); } } - this.state = 615; + this.state = 622; this.match(QuintParser.RPAREN); } break; @@ -2510,15 +2524,15 @@ export class QuintParser extends Parser { { _localctx = new ListAppContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 618; - if (!(this.precpred(this._ctx, 27))) { - throw this.createFailedPredicateException("this.precpred(this._ctx, 27)"); + this.state = 625; + if (!(this.precpred(this._ctx, 28))) { + throw this.createFailedPredicateException("this.precpred(this._ctx, 28)"); } - this.state = 619; + this.state = 626; this.match(QuintParser.T__25); - this.state = 620; + this.state = 627; this.expr(0); - this.state = 621; + this.state = 628; this.match(QuintParser.T__26); } break; @@ -2527,13 +2541,13 @@ export class QuintParser extends Parser { { _localctx = new MatchContext(new ExprContext(_parentctx, _parentState)); this.pushNewRecursionContext(_localctx, _startState, QuintParser.RULE_expr); - this.state = 623; + this.state = 630; if (!(this.precpred(this._ctx, 13))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 13)"); } - this.state = 624; + this.state = 631; this.match(QuintParser.MATCH); - this.state = 632; + this.state = 639; this._errHandler.sync(this); _alt = 1; do { @@ -2541,17 +2555,17 @@ export class QuintParser extends Parser { case 1: { { - this.state = 625; + this.state = 632; this.match(QuintParser.T__10); - this.state = 626; + this.state = 633; this.match(QuintParser.STRING); - this.state = 627; + this.state = 634; this.match(QuintParser.T__4); - this.state = 628; + this.state = 635; this.parameter(); - this.state = 629; + this.state = 636; this.match(QuintParser.T__24); - this.state = 630; + this.state = 637; this.expr(0); } } @@ -2559,7 +2573,7 @@ export class QuintParser extends Parser { default: throw new NoViableAltException(this); } - this.state = 634; + this.state = 641; this._errHandler.sync(this); _alt = this.interpreter.adaptivePredict(this._input, 65, this._ctx); } while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER); @@ -2568,10 +2582,175 @@ export class QuintParser extends Parser { } } } - this.state = 640; - this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); + this.state = 647; + this._errHandler.sync(this); + _alt = this.interpreter.adaptivePredict(this._input, 67, this._ctx); + } + } + } + catch (re) { + if (re instanceof RecognitionException) { + _localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.unrollRecursionContexts(_parentctx); + } + return _localctx; + } + // @RuleVersion(0) + public matchSumExpr(): MatchSumExprContext { + let _localctx: MatchSumExprContext = new MatchSumExprContext(this._ctx, this.state); + this.enterRule(_localctx, 42, QuintParser.RULE_matchSumExpr); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 648; + this.match(QuintParser.MATCH); + this.state = 649; + this.expr(0); + this.state = 650; + this.match(QuintParser.T__1); + this.state = 652; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.T__10) { + { + this.state = 651; + this.match(QuintParser.T__10); + } + } + + this.state = 654; + _localctx._matchSumCase = this.matchSumCase(); + _localctx._matchCase.push(_localctx._matchSumCase); + this.state = 659; + this._errHandler.sync(this); + _la = this._input.LA(1); + while (_la === QuintParser.T__10) { + { + { + this.state = 655; + this.match(QuintParser.T__10); + this.state = 656; + _localctx._matchSumCase = this.matchSumCase(); + _localctx._matchCase.push(_localctx._matchSumCase); + } + } + this.state = 661; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + this.state = 662; + this.match(QuintParser.T__2); + } + } + 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 matchSumCase(): MatchSumCaseContext { + let _localctx: MatchSumCaseContext = new MatchSumCaseContext(this._ctx, this.state); + this.enterRule(_localctx, 44, QuintParser.RULE_matchSumCase); + try { + this.enterOuterAlt(_localctx, 1); + { + this.state = 666; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case QuintParser.IDENTIFIER: + { + this.state = 664; + _localctx._variantMatch = this.matchSumVariant(); + } + break; + case QuintParser.T__36: + { + this.state = 665; + _localctx._wildCardMatch = this.match(QuintParser.T__36); + } + break; + default: + throw new NoViableAltException(this); + } + this.state = 668; + this.match(QuintParser.T__24); + this.state = 669; + this.expr(0); + } + } + 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 matchSumVariant(): MatchSumVariantContext { + let _localctx: MatchSumVariantContext = new MatchSumVariantContext(this._ctx, this.state); + this.enterRule(_localctx, 46, QuintParser.RULE_matchSumVariant); + let _la: number; + try { + this.enterOuterAlt(_localctx, 1); + { + { + this.state = 671; + _localctx._variantLabel = this.simpleId("variant label"); + } + this.state = 678; + this._errHandler.sync(this); + _la = this._input.LA(1); + if (_la === QuintParser.LPAREN) { + { + this.state = 672; + this.match(QuintParser.LPAREN); + this.state = 675; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case QuintParser.IDENTIFIER: + { + this.state = 673; + _localctx._variantParam = this.simpleId("match case parameter"); + } + break; + case QuintParser.T__36: + { + this.state = 674; + this.match(QuintParser.T__36); + } + break; + default: + throw new NoViableAltException(this); + } + this.state = 677; + this.match(QuintParser.RPAREN); + } } + } } catch (re) { @@ -2584,24 +2763,24 @@ export class QuintParser extends Parser { } } finally { - this.unrollRecursionContexts(_parentctx); + this.exitRule(); } return _localctx; } // @RuleVersion(0) public unitOrExpr(): UnitOrExprContext { let _localctx: UnitOrExprContext = new UnitOrExprContext(this._ctx, this.state); - this.enterRule(_localctx, 42, QuintParser.RULE_unitOrExpr); + this.enterRule(_localctx, 48, QuintParser.RULE_unitOrExpr); try { - this.state = 650; + this.state = 689; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 68, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 73, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 641; + this.state = 680; this.unit(); - this.state = 642; + this.state = 681; this.match(QuintParser.EOF); } break; @@ -2609,9 +2788,9 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 644; + this.state = 683; this.expr(0); - this.state = 645; + this.state = 684; this.match(QuintParser.EOF); } break; @@ -2619,9 +2798,9 @@ export class QuintParser extends Parser { case 3: this.enterOuterAlt(_localctx, 3); { - this.state = 647; + this.state = 686; this.match(QuintParser.DOCCOMMENT); - this.state = 648; + this.state = 687; this.match(QuintParser.EOF); } break; @@ -2629,7 +2808,7 @@ export class QuintParser extends Parser { case 4: this.enterOuterAlt(_localctx, 4); { - this.state = 649; + this.state = 688; this.match(QuintParser.EOF); } break; @@ -2652,52 +2831,52 @@ export class QuintParser extends Parser { // @RuleVersion(0) public lambda(): LambdaContext { let _localctx: LambdaContext = new LambdaContext(this._ctx, this.state); - this.enterRule(_localctx, 44, QuintParser.RULE_lambda); + this.enterRule(_localctx, 50, QuintParser.RULE_lambda); let _la: number; try { - this.state = 669; + this.state = 708; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 652; + this.state = 691; this.parameter(); - this.state = 653; + this.state = 692; this.match(QuintParser.T__24); - this.state = 654; + this.state = 693; this.expr(0); } break; case QuintParser.LPAREN: this.enterOuterAlt(_localctx, 2); { - this.state = 656; + this.state = 695; this.match(QuintParser.LPAREN); - this.state = 657; + this.state = 696; this.parameter(); - this.state = 662; + this.state = 701; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 658; + this.state = 697; this.match(QuintParser.T__7); - this.state = 659; + this.state = 698; this.parameter(); } } - this.state = 664; + this.state = 703; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 665; + this.state = 704; this.match(QuintParser.RPAREN); - this.state = 666; + this.state = 705; this.match(QuintParser.T__24); - this.state = 667; + this.state = 706; this.expr(0); } break; @@ -2722,22 +2901,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrHole(): IdentOrHoleContext { let _localctx: IdentOrHoleContext = new IdentOrHoleContext(this._ctx, this.state); - this.enterRule(_localctx, 46, QuintParser.RULE_identOrHole); + this.enterRule(_localctx, 52, QuintParser.RULE_identOrHole); try { - this.state = 673; + this.state = 712; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.T__36: this.enterOuterAlt(_localctx, 1); { - this.state = 671; + this.state = 710; this.match(QuintParser.T__36); } break; case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 2); { - this.state = 672; + this.state = 711; this.qualId(); } break; @@ -2762,11 +2941,11 @@ export class QuintParser extends Parser { // @RuleVersion(0) public parameter(): ParameterContext { let _localctx: ParameterContext = new ParameterContext(this._ctx, this.state); - this.enterRule(_localctx, 48, QuintParser.RULE_parameter); + this.enterRule(_localctx, 54, QuintParser.RULE_parameter); try { this.enterOuterAlt(_localctx, 1); { - this.state = 675; + this.state = 714; this.identOrHole(); } } @@ -2787,22 +2966,22 @@ export class QuintParser extends Parser { // @RuleVersion(0) public identOrStar(): IdentOrStarContext { let _localctx: IdentOrStarContext = new IdentOrStarContext(this._ctx, this.state); - this.enterRule(_localctx, 50, QuintParser.RULE_identOrStar); + this.enterRule(_localctx, 56, QuintParser.RULE_identOrStar); try { - this.state = 679; + this.state = 718; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.MUL: this.enterOuterAlt(_localctx, 1); { - this.state = 677; + this.state = 716; this.match(QuintParser.MUL); } break; case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 2); { - this.state = 678; + this.state = 717; this.qualId(); } break; @@ -2827,26 +3006,26 @@ export class QuintParser extends Parser { // @RuleVersion(0) public argList(): ArgListContext { let _localctx: ArgListContext = new ArgListContext(this._ctx, this.state); - this.enterRule(_localctx, 52, QuintParser.RULE_argList); + this.enterRule(_localctx, 58, QuintParser.RULE_argList); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 681; + this.state = 720; this.expr(0); - this.state = 686; + this.state = 725; this._errHandler.sync(this); _la = this._input.LA(1); while (_la === QuintParser.T__7) { { { - this.state = 682; + this.state = 721; this.match(QuintParser.T__7); - this.state = 683; + this.state = 722; this.expr(0); } } - this.state = 688; + this.state = 727; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -2869,28 +3048,28 @@ export class QuintParser extends Parser { // @RuleVersion(0) public recElem(): RecElemContext { let _localctx: RecElemContext = new RecElemContext(this._ctx, this.state); - this.enterRule(_localctx, 54, QuintParser.RULE_recElem); + this.enterRule(_localctx, 60, QuintParser.RULE_recElem); try { - this.state = 695; + this.state = 734; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 689; + this.state = 728; this.simpleId("record"); - this.state = 690; + this.state = 729; this.match(QuintParser.T__4); - this.state = 691; + this.state = 730; this.expr(0); } break; case QuintParser.T__37: this.enterOuterAlt(_localctx, 2); { - this.state = 693; + this.state = 732; this.match(QuintParser.T__37); - this.state = 694; + this.state = 733; this.expr(0); } break; @@ -2915,16 +3094,16 @@ export class QuintParser extends Parser { // @RuleVersion(0) public normalCallName(): NormalCallNameContext { let _localctx: NormalCallNameContext = new NormalCallNameContext(this._ctx, this.state); - this.enterRule(_localctx, 56, QuintParser.RULE_normalCallName); + this.enterRule(_localctx, 62, QuintParser.RULE_normalCallName); let _la: number; try { - this.state = 699; + this.state = 738; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 697; + this.state = 736; this.qualId(); } break; @@ -2937,7 +3116,7 @@ export class QuintParser extends Parser { case QuintParser.MAP: this.enterOuterAlt(_localctx, 2); { - this.state = 698; + this.state = 737; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)) | (1 << (QuintParser.SET - 43)) | (1 << (QuintParser.LIST - 43)) | (1 << (QuintParser.MAP - 43)))) !== 0))) { @@ -2973,16 +3152,16 @@ export class QuintParser extends Parser { // @RuleVersion(0) public nameAfterDot(): NameAfterDotContext { let _localctx: NameAfterDotContext = new NameAfterDotContext(this._ctx, this.state); - this.enterRule(_localctx, 58, QuintParser.RULE_nameAfterDot); + this.enterRule(_localctx, 64, QuintParser.RULE_nameAfterDot); let _la: number; try { - this.state = 703; + this.state = 742; this._errHandler.sync(this); switch (this._input.LA(1)) { case QuintParser.IDENTIFIER: this.enterOuterAlt(_localctx, 1); { - this.state = 701; + this.state = 740; this.qualId(); } break; @@ -2992,7 +3171,7 @@ export class QuintParser extends Parser { case QuintParser.IMPLIES: this.enterOuterAlt(_localctx, 2); { - this.state = 702; + this.state = 741; _localctx._op = this._input.LT(1); _la = this._input.LA(1); if (!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & ((1 << (QuintParser.AND - 43)) | (1 << (QuintParser.OR - 43)) | (1 << (QuintParser.IFF - 43)) | (1 << (QuintParser.IMPLIES - 43)))) !== 0))) { @@ -3028,12 +3207,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public operator(): OperatorContext { let _localctx: OperatorContext = new OperatorContext(this._ctx, this.state); - this.enterRule(_localctx, 60, QuintParser.RULE_operator); + this.enterRule(_localctx, 66, QuintParser.RULE_operator); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 705; + this.state = 744; _la = this._input.LA(1); if (!(((((_la - 31)) & ~0x1F) === 0 && ((1 << (_la - 31)) & ((1 << (QuintParser.T__30 - 31)) | (1 << (QuintParser.AND - 31)) | (1 << (QuintParser.OR - 31)) | (1 << (QuintParser.IFF - 31)) | (1 << (QuintParser.IMPLIES - 31)) | (1 << (QuintParser.PLUS - 31)) | (1 << (QuintParser.MINUS - 31)) | (1 << (QuintParser.MUL - 31)) | (1 << (QuintParser.DIV - 31)) | (1 << (QuintParser.MOD - 31)) | (1 << (QuintParser.GT - 31)) | (1 << (QuintParser.LT - 31)) | (1 << (QuintParser.GE - 31)) | (1 << (QuintParser.LE - 31)) | (1 << (QuintParser.NE - 31)) | (1 << (QuintParser.EQ - 31)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3064,12 +3243,12 @@ export class QuintParser extends Parser { // @RuleVersion(0) public literal(): LiteralContext { let _localctx: LiteralContext = new LiteralContext(this._ctx, this.state); - this.enterRule(_localctx, 62, QuintParser.RULE_literal); + this.enterRule(_localctx, 68, QuintParser.RULE_literal); let _la: number; try { this.enterOuterAlt(_localctx, 1); { - this.state = 707; + this.state = 746; _la = this._input.LA(1); if (!(((((_la - 40)) & ~0x1F) === 0 && ((1 << (_la - 40)) & ((1 << (QuintParser.STRING - 40)) | (1 << (QuintParser.BOOL - 40)) | (1 << (QuintParser.INT - 40)))) !== 0))) { this._errHandler.recoverInline(this); @@ -3100,30 +3279,30 @@ export class QuintParser extends Parser { // @RuleVersion(0) public qualId(): QualIdContext { let _localctx: QualIdContext = new QualIdContext(this._ctx, this.state); - this.enterRule(_localctx, 64, QuintParser.RULE_qualId); + this.enterRule(_localctx, 70, QuintParser.RULE_qualId); try { let _alt: number; this.enterOuterAlt(_localctx, 1); { - this.state = 709; + this.state = 748; this.match(QuintParser.IDENTIFIER); - this.state = 714; + this.state = 753; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 77, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 82, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 710; + this.state = 749; this.match(QuintParser.T__38); - this.state = 711; + this.state = 750; this.match(QuintParser.IDENTIFIER); } } } - this.state = 716; + this.state = 755; this._errHandler.sync(this); - _alt = this.interpreter.adaptivePredict(this._input, 77, this._ctx); + _alt = this.interpreter.adaptivePredict(this._input, 82, this._ctx); } } } @@ -3144,15 +3323,15 @@ export class QuintParser extends Parser { // @RuleVersion(0) public simpleId(context: string): SimpleIdContext { let _localctx: SimpleIdContext = new SimpleIdContext(this._ctx, this.state, context); - this.enterRule(_localctx, 66, QuintParser.RULE_simpleId); + this.enterRule(_localctx, 72, QuintParser.RULE_simpleId); try { - this.state = 721; + this.state = 760; this._errHandler.sync(this); - switch ( this.interpreter.adaptivePredict(this._input, 78, this._ctx) ) { + switch ( this.interpreter.adaptivePredict(this._input, 83, this._ctx) ) { case 1: this.enterOuterAlt(_localctx, 1); { - this.state = 717; + this.state = 756; this.match(QuintParser.IDENTIFIER); } break; @@ -3160,7 +3339,7 @@ export class QuintParser extends Parser { case 2: this.enterOuterAlt(_localctx, 2); { - this.state = 718; + this.state = 757; _localctx._qualId = this.qualId(); const err = quintErrorToString( @@ -3212,40 +3391,40 @@ export class QuintParser extends Parser { private expr_sempred(_localctx: ExprContext, predIndex: number): boolean { switch (predIndex) { case 2: - return this.precpred(this._ctx, 26); + return this.precpred(this._ctx, 27); case 3: - return this.precpred(this._ctx, 24); + return this.precpred(this._ctx, 25); case 4: - return this.precpred(this._ctx, 23); + return this.precpred(this._ctx, 24); case 5: - return this.precpred(this._ctx, 22); + return this.precpred(this._ctx, 23); case 6: - return this.precpred(this._ctx, 20); + return this.precpred(this._ctx, 21); case 7: - return this.precpred(this._ctx, 18); + return this.precpred(this._ctx, 19); case 8: - return this.precpred(this._ctx, 16); + return this.precpred(this._ctx, 17); case 9: - return this.precpred(this._ctx, 15); + return this.precpred(this._ctx, 16); case 10: - return this.precpred(this._ctx, 14); + return this.precpred(this._ctx, 15); case 11: return this.precpred(this._ctx, 8); case 12: - return this.precpred(this._ctx, 30); + return this.precpred(this._ctx, 31); case 13: - return this.precpred(this._ctx, 27); + return this.precpred(this._ctx, 28); case 14: return this.precpred(this._ctx, 13); @@ -3255,389 +3434,411 @@ export class QuintParser extends Parser { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03G\u02D6\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03G\u02FD\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#\x03\x02\x06\x02H\n\x02\r\x02\x0E\x02I\x03\x02\x03\x02\x03\x03\x07" + - "\x03O\n\x03\f\x03\x0E\x03R\v\x03\x03\x03\x03\x03\x03\x03\x03\x03\x07\x03" + - "X\n\x03\f\x03\x0E\x03[\v\x03\x03\x03\x03\x03\x03\x04\x07\x04`\n\x04\f" + - "\x04\x0E\x04c\v\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03" + - "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x05\x05{\n\x05\x03" + - "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\x83\n\x06\f\x06\x0E" + - "\x06\x86\v\x06\x05\x06\x88\n\x06\x03\x06\x03\x06\x03\x06\x05\x06\x8D\n" + - "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + - "\x06\x03\x06\x03\x06\x07\x06\x9A\n\x06\f\x06\x0E\x06\x9D\v\x06\x03\x06" + - "\x03\x06\x03\x06\x03\x06\x05\x06\xA3\n\x06\x03\x06\x03\x06\x05\x06\xA7" + - "\n\x06\x03\x06\x05\x06\xAA\n\x06\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07" + - "\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05\x07\xB7\n\x07\x03" + - "\x07\x03\x07\x03\x07\x07\x07\xBC\n\x07\f\x07\x0E\x07\xBF\v\x07\x05\x07" + - "\xC1\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x05\b\xC8\n\b\x03\t\x03\t\x03" + - "\t\x03\t\x05\t\xCE\n\t\x03\t\x03\t\x03\t\x05\t\xD3\n\t\x03\n\x03\n\x03" + - "\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xDE\n\n\x03\v\x03\v\x03\v" + - "\x03\v\x03\v\x03\v\x05\v\xE6\n\v\x03\v\x03\v\x03\v\x03\v\x05\v\xEC\n\v" + - "\x03\v\x03\v\x05\v\xF0\n\v\x05\v\xF2\n\v\x03\f\x03\f\x03\f\x03\f\x03\f" + - "\x03\f\x03\f\x03\f\x03\f\x05\f\xFD\n\f\x05\f\xFF\n\f\x03\r\x03\r\x03\r" + - "\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x07\r\u010C\n\r\f\r\x0E" + - "\r\u010F\v\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u0116\n\r\x03\r\x03\r" + - "\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x07\r\u0123\n\r" + - "\f\r\x0E\r\u0126\v\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u012D\n\r\x05" + - "\r\u012F\n\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x10\x03\x10\x03\x11\x03" + - "\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u013E\n\x12\f\x12" + - "\x0E\x12\u0141\v\x12\x05\x12\u0143\n\x12\x03\x12\x05\x12\u0146\n\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x07\x12\u015B\n\x12\f\x12\x0E\x12\u015E\v\x12\x03\x12\x05\x12\u0161" + - "\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x06\x12" + - "\u016A\n\x12\r\x12\x0E\x12\u016B\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + - "\x03\x12\x03\x12\x03\x12\x05\x12\u0176\n\x12\x03\x12\x03\x12\x03\x12\x03" + - "\x12\x03\x12\x03\x12\x07\x12\u017E\n\x12\f\x12\x0E\x12\u0181\v\x12\x03" + - "\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13\u018A\n\x13" + - "\x03\x13\x05\x13\u018D\n\x13\x03\x13\x03\x13\x03\x14\x03\x14\x03\x14\x03" + - "\x14\x03\x14\x07\x14\u0196\n\x14\f\x14\x0E\x14\u0199\v\x14\x03\x14\x03" + - "\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u01A2\n\x14\x05\x14" + - "\u01A4\n\x14\x03\x14\x03\x14\x05\x14\u01A8\n\x14\x03\x15\x03\x15\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01B1\n\x16\x03\x16\x03\x16\x03" + + "\t#\x04$\t$\x04%\t%\x04&\t&\x03\x02\x06\x02N\n\x02\r\x02\x0E\x02O\x03" + + "\x02\x03\x02\x03\x03\x07\x03U\n\x03\f\x03\x0E\x03X\v\x03\x03\x03\x03\x03" + + "\x03\x03\x03\x03\x07\x03^\n\x03\f\x03\x0E\x03a\v\x03\x03\x03\x03\x03\x03" + + "\x04\x07\x04f\n\x04\f\x04\x0E\x04i\v\x04\x03\x04\x03\x04\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + + "\x05\x05\x81\n\x05\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07" + + "\x06\x89\n\x06\f\x06\x0E\x06\x8C\v\x06\x05\x06\x8E\n\x06\x03\x06\x03\x06" + + "\x03\x06\x05\x06\x93\n\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03" + + "\x06\x03\x06\x03\x06\x03\x06\x03\x06\x03\x06\x07\x06\xA0\n\x06\f\x06\x0E" + + "\x06\xA3\v\x06\x03\x06\x03\x06\x03\x06\x03\x06\x05\x06\xA9\n\x06\x03\x06" + + "\x03\x06\x05\x06\xAD\n\x06\x03\x06\x05\x06\xB0\n\x06\x03\x07\x03\x07\x03" + + "\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x03\x07\x05" + + "\x07\xBD\n\x07\x03\x07\x03\x07\x03\x07\x07\x07\xC2\n\x07\f\x07\x0E\x07" + + "\xC5\v\x07\x05\x07\xC7\n\x07\x03\b\x03\b\x03\b\x03\b\x03\b\x05\b\xCE\n" + + "\b\x03\t\x03\t\x03\t\x03\t\x05\t\xD4\n\t\x03\t\x03\t\x03\t\x05\t\xD9\n" + + "\t\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x03\n\x05\n\xE4\n\n" + + "\x03\v\x03\v\x03\v\x03\v\x03\v\x03\v\x05\v\xEC\n\v\x03\v\x03\v\x03\v\x03" + + "\v\x05\v\xF2\n\v\x03\v\x03\v\x05\v\xF6\n\v\x05\v\xF8\n\v\x03\f\x03\f\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\u0103\n\f\x05\f\u0105\n\f" + + "\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x07" + + "\r\u0112\n\r\f\r\x0E\r\u0115\v\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05\r\u011C" + + "\n\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r\x03\r" + + "\x07\r\u0129\n\r\f\r\x0E\r\u012C\v\r\x03\r\x03\r\x03\r\x03\r\x03\r\x05" + + "\r\u0133\n\r\x05\r\u0135\n\r\x03\x0E\x03\x0E\x03\x0F\x03\x0F\x03\x10\x03" + + "\x10\x03\x11\x03\x11\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0144" + + "\n\x12\f\x12\x0E\x12\u0147\v\x12\x05\x12\u0149\n\x12\x03\x12\x05\x12\u014C" + + "\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + + "\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12" + + "\x03\x12\x03\x12\x07\x12\u0161\n\x12\f\x12\x0E\x12\u0164\v\x12\x03\x12" + + "\x05\x12\u0167\n\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x06\x12\u0170\n\x12\r\x12\x0E\x12\u0171\x03\x12\x03\x12\x03\x12\x03" + + "\x12\x03\x12\x03\x12\x03\x12\x03\x12\x05\x12\u017C\n\x12\x03\x12\x03\x12" + + "\x03\x12\x03\x12\x03\x12\x03\x12\x07\x12\u0184\n\x12\f\x12\x0E\x12\u0187" + + "\v\x12\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x03\x13\x05\x13" + + "\u0190\n\x13\x03\x13\x05\x13\u0193\n\x13\x03\x13\x03\x13\x03\x14\x03\x14" + + "\x03\x14\x03\x14\x03\x14\x07\x14\u019C\n\x14\f\x14\x0E\x14\u019F\v\x14" + + "\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x03\x14\x05\x14\u01A8" + + "\n\x14\x05\x14\u01AA\n\x14\x03\x14\x03\x14\x05\x14\u01AE\n\x14\x03\x15" + + "\x03\x15\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01B7\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\x07\x16\u01C1\n\x16\f\x16\x0E\x16\u01C4\v\x16\x03" + - "\x16\x05\x16\u01C7\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + - "\x03\x16\x07\x16\u01D0\n\x16\f\x16\x0E\x16\u01D3\v\x16\x03\x16\x05\x16" + - "\u01D6\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07" + - "\x16\u01DF\n\x16\f\x16\x0E\x16\u01E2\v\x16\x03\x16\x05\x16\u01E5\n\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01EE" + - "\n\x16\f\x16\x0E\x16\u01F1\v\x16\x03\x16\x05\x16\u01F4\n\x16\x03\x16\x03" + - "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u01FC\n\x16\x03\x16\x03\x16" + - "\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0204\n\x16\f\x16\x0E\x16\u0207" + - "\v\x16\x03\x16\x05\x16\u020A\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + - "\x16\x03\x16\x07\x16\u0212\n\x16\f\x16\x0E\x16\u0215\v\x16\x03\x16\x05" + - "\x16\u0218\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16" + - "\u0220\n\x16\f\x16\x0E\x16\u0223\v\x16\x05\x16\u0225\n\x16\x03\x16\x05" + - "\x16\u0228\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\x05\x16\u0241" + - "\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" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u01C7\n\x16\f\x16\x0E\x16" + + "\u01CA\v\x16\x03\x16\x05\x16\u01CD\n\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x03\x16\x07\x16\u01D6\n\x16\f\x16\x0E\x16\u01D9\v\x16" + + "\x03\x16\x05\x16\u01DC\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x07\x16\u01E6\n\x16\f\x16\x0E\x16\u01E9\v\x16\x03" + + "\x16\x05\x16\u01EC\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x07\x16\u01F5\n\x16\f\x16\x0E\x16\u01F8\v\x16\x03\x16\x05\x16" + + "\u01FB\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x05\x16\u0203" + + "\n\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u020B\n" + + "\x16\f\x16\x0E\x16\u020E\v\x16\x03\x16\x05\x16\u0211\n\x16\x03\x16\x03" + + "\x16\x03\x16\x03\x16\x03\x16\x03\x16\x07\x16\u0219\n\x16\f\x16\x0E\x16" + + "\u021C\v\x16\x03\x16\x05\x16\u021F\n\x16\x03\x16\x03\x16\x03\x16\x03\x16" + + "\x03\x16\x03\x16\x07\x16\u0227\n\x16\f\x16\x0E\x16\u022A\v\x16\x05\x16" + + "\u022C\n\x16\x03\x16\x05\x16\u022F\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\x05\x16\u0268\n\x16\x03\x16\x05\x16\u026B\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\x06\x16\u027B\n\x16\r\x16\x0E\x16\u027C" + - "\x07\x16\u027F\n\x16\f\x16\x0E\x16\u0282\v\x16\x03\x17\x03\x17\x03\x17" + - "\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x03\x17\x05\x17\u028D\n\x17\x03" + - "\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x03\x18\x07\x18\u0297" + - "\n\x18\f\x18\x0E\x18\u029A\v\x18\x03\x18\x03\x18\x03\x18\x03\x18\x05\x18" + - "\u02A0\n\x18\x03\x19\x03\x19\x05\x19\u02A4\n\x19\x03\x1A\x03\x1A\x03\x1B" + - "\x03\x1B\x05\x1B\u02AA\n\x1B\x03\x1C\x03\x1C\x03\x1C\x07\x1C\u02AF\n\x1C" + - "\f\x1C\x0E\x1C\u02B2\v\x1C\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03\x1D\x03" + - "\x1D\x05\x1D\u02BA\n\x1D\x03\x1E\x03\x1E\x05\x1E\u02BE\n\x1E\x03\x1F\x03" + - "\x1F\x05\x1F\u02C2\n\x1F\x03 \x03 \x03!\x03!\x03\"\x03\"\x03\"\x07\"\u02CB" + - "\n\"\f\"\x0E\"\u02CE\v\"\x03#\x03#\x03#\x03#\x05#\u02D4\n#\x03#\x02\x02" + - "\x04\"*$\x02\x02\x04\x02\x06\x02\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12" + - "\x02\x14\x02\x16\x02\x18\x02\x1A\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&" + - "\x02(\x02*\x02,\x02.\x020\x022\x024\x026\x028\x02:\x02<\x02>\x02@\x02" + - "B\x02D\x02\x02\t\x03\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05" + - "\x02!!-05?\x03\x02*,\x02\u0338\x02G\x03\x02\x02\x02\x04P\x03\x02\x02\x02" + - "\x06a\x03\x02\x02\x02\bz\x03\x02\x02\x02\n|\x03\x02\x02\x02\f\xC0\x03" + - "\x02\x02\x02\x0E\xC2\x03\x02\x02\x02\x10\xC9\x03\x02\x02\x02\x12\xDD\x03" + - "\x02\x02\x02\x14\xF1\x03\x02\x02\x02\x16\xFE\x03\x02\x02\x02\x18\u012E" + - "\x03\x02\x02\x02\x1A\u0130\x03\x02\x02\x02\x1C\u0132\x03\x02\x02\x02\x1E" + - "\u0134\x03\x02\x02\x02 \u0136\x03\x02\x02\x02\"\u0175\x03\x02\x02\x02" + - "$\u0182\x03\x02\x02\x02&\u01A7\x03\x02\x02\x02(\u01A9\x03\x02\x02\x02" + - "*\u0240\x03\x02\x02\x02,\u028C\x03\x02\x02\x02.\u029F\x03\x02\x02\x02" + - "0\u02A3\x03\x02\x02\x022\u02A5\x03\x02\x02\x024\u02A9\x03\x02\x02\x02" + - "6\u02AB\x03\x02\x02\x028\u02B9\x03\x02\x02\x02:\u02BD\x03\x02\x02\x02" + - "<\u02C1\x03\x02\x02\x02>\u02C3\x03\x02\x02\x02@\u02C5\x03\x02\x02\x02" + - "B\u02C7\x03\x02\x02\x02D\u02D3\x03\x02\x02\x02FH\x05\x04\x03\x02GF\x03" + - "\x02\x02\x02HI\x03\x02\x02\x02IG\x03\x02\x02\x02IJ\x03\x02\x02\x02JK\x03" + - "\x02\x02\x02KL\x07\x02\x02\x03L\x03\x03\x02\x02\x02MO\x07D\x02\x02NM\x03" + - "\x02\x02\x02OR\x03\x02\x02\x02PN\x03\x02\x02\x02PQ\x03\x02\x02\x02QS\x03" + - "\x02\x02\x02RP\x03\x02\x02\x02ST\x07\x03\x02\x02TU\x05B\"\x02UY\x07\x04" + - "\x02\x02VX\x05\x06\x04\x02WV\x03\x02\x02\x02X[\x03\x02\x02\x02YW\x03\x02" + - "\x02\x02YZ\x03\x02\x02\x02Z\\\x03\x02\x02\x02[Y\x03\x02\x02\x02\\]\x07" + - "\x05\x02\x02]\x05\x03\x02\x02\x02^`\x07D\x02\x02_^\x03\x02\x02\x02`c\x03" + - "\x02\x02\x02a_\x03\x02\x02\x02ab\x03\x02\x02\x02bd\x03\x02\x02\x02ca\x03" + - "\x02\x02\x02de\x05\b\x05\x02e\x07\x03\x02\x02\x02fg\x07\x06\x02\x02gh" + - "\x05B\"\x02hi\x07\x07\x02\x02ij\x05\"\x12\x02j{\x03\x02\x02\x02kl\x07" + - "\b\x02\x02lm\x05B\"\x02mn\x07\x07\x02\x02no\x05\"\x12\x02o{\x03\x02\x02" + - "\x02pq\x07\t\x02\x02qr\x050\x19\x02rs\x07@\x02\x02st\x05*\x16\x02t{\x03" + - "\x02\x02\x02u{\x05\x18\r\x02v{\x05\n\x06\x02w{\x05\f\x07\x02x{\x05\x14" + - "\v\x02y{\x05\x16\f\x02zf\x03\x02\x02\x02zk\x03\x02\x02\x02zp\x03\x02\x02" + - "\x02zu\x03\x02\x02\x02zv\x03\x02\x02\x02zw\x03\x02\x02\x02zx\x03\x02\x02" + - "\x02zy\x03\x02\x02\x02{\t\x03\x02\x02\x02|}\x05\x12\n\x02}\xA2\x05:\x1E" + - "\x02~\x87\x07A\x02\x02\x7F\x84\x052\x1A\x02\x80\x81\x07\n\x02\x02\x81" + - "\x83\x052\x1A\x02\x82\x80\x03\x02\x02\x02\x83\x86\x03\x02\x02\x02\x84" + - "\x82\x03\x02\x02\x02\x84\x85\x03\x02\x02\x02\x85\x88\x03\x02\x02\x02\x86" + - "\x84\x03\x02\x02\x02\x87\x7F\x03\x02\x02\x02\x87\x88\x03\x02\x02\x02\x88" + - "\x89\x03\x02\x02\x02\x89\x8C\x07B\x02\x02\x8A\x8B\x07\x07\x02\x02\x8B" + - "\x8D\x05\"\x12\x02\x8C\x8A\x03\x02\x02\x02\x8C\x8D\x03\x02\x02\x02\x8D" + - "\xA3\x03\x02\x02\x02\x8E\x8F\x07\x07\x02\x02\x8F\xA3\x05\"\x12\x02\x90" + - "\x91\x07A\x02\x02\x91\x92\x052\x1A\x02\x92\x93\x07\x07\x02\x02\x93\x9B" + - "\x05\"\x12\x02\x94\x95\x07\n\x02\x02\x95\x96\x052\x1A\x02\x96\x97\x07" + - "\x07\x02\x02\x97\x98\x05\"\x12\x02\x98\x9A\x03\x02\x02\x02\x99\x94\x03" + - "\x02\x02\x02\x9A\x9D\x03\x02\x02\x02\x9B\x99\x03\x02\x02\x02\x9B\x9C\x03" + - "\x02\x02\x02\x9C\x9E\x03\x02\x02\x02\x9D\x9B\x03\x02\x02\x02\x9E\x9F\x07" + - "B\x02\x02\x9F\xA0\x07\x07\x02\x02\xA0\xA1\x05\"\x12\x02\xA1\xA3\x03\x02" + - "\x02\x02\xA2~\x03\x02\x02\x02\xA2\x8E\x03\x02\x02\x02\xA2\x90\x03\x02" + - "\x02\x02\xA2\xA3\x03\x02\x02\x02\xA3\xA6\x03\x02\x02\x02\xA4\xA5\x07@" + - "\x02\x02\xA5\xA7\x05*\x16\x02\xA6\xA4\x03\x02\x02\x02\xA6\xA7\x03\x02" + - "\x02\x02\xA7\xA9\x03\x02\x02\x02\xA8\xAA\x07\v\x02\x02\xA9\xA8\x03\x02" + - "\x02\x02\xA9\xAA\x03\x02\x02\x02\xAA\v\x03\x02\x02\x02\xAB\xAC\x07\f\x02" + - "\x02\xAC\xC1\x05B\"\x02\xAD\xAE\x07\f\x02\x02\xAE\xAF\x05B\"\x02\xAF\xB0" + - "\x07@\x02\x02\xB0\xB1\x05\"\x12\x02\xB1\xC1\x03\x02\x02\x02\xB2\xB3\x07" + - "\f\x02\x02\xB3\xB4\x05B\"\x02\xB4\xB6\x07@\x02\x02\xB5\xB7\x07\r\x02\x02" + - "\xB6\xB5\x03\x02\x02\x02\xB6\xB7\x03\x02\x02\x02\xB7\xB8\x03\x02\x02\x02" + - "\xB8\xBD\x05\x0E\b\x02\xB9\xBA\x07\r\x02\x02\xBA\xBC\x05\x0E\b\x02\xBB" + - "\xB9\x03\x02\x02\x02\xBC\xBF\x03\x02\x02\x02\xBD\xBB\x03\x02\x02\x02\xBD" + - "\xBE\x03\x02\x02\x02\xBE\xC1\x03\x02\x02\x02\xBF\xBD\x03\x02\x02\x02\xC0" + - "\xAB\x03\x02\x02\x02\xC0\xAD\x03\x02\x02\x02\xC0\xB2\x03\x02\x02\x02\xC1" + - "\r\x03\x02\x02\x02\xC2\xC7\x05D#\x02\xC3\xC4\x07A\x02\x02\xC4\xC5\x05" + - "\"\x12\x02\xC5\xC6\x07B\x02\x02\xC6\xC8\x03\x02\x02\x02\xC7\xC3\x03\x02" + - "\x02\x02\xC7\xC8\x03\x02\x02\x02\xC8\x0F\x03\x02\x02\x02\xC9\xCA\x07\x0E" + - "\x02\x02\xCA\xCD\x05B\"\x02\xCB\xCC\x07\x07\x02\x02\xCC\xCE\x05\"\x12" + - "\x02\xCD\xCB\x03\x02\x02\x02\xCD\xCE\x03\x02\x02\x02\xCE\xCF\x03\x02\x02" + - "\x02\xCF\xD0\x07@\x02\x02\xD0\xD2\x05*\x16\x02\xD1\xD3\x07\v\x02\x02\xD2" + - "\xD1\x03\x02\x02\x02\xD2\xD3\x03\x02\x02\x02\xD3\x11\x03\x02\x02\x02\xD4" + - "\xDE\x07\x0F\x02\x02\xD5\xDE\x07\x10\x02\x02\xD6\xD7\x07\x11\x02\x02\xD7" + - "\xDE\x07\x0F\x02\x02\xD8\xD9\x07\x11\x02\x02\xD9\xDE\x07\x10\x02\x02\xDA" + - "\xDE\x07\x12\x02\x02\xDB\xDE\x07\x13\x02\x02\xDC\xDE\x07\x14\x02\x02\xDD" + - "\xD4\x03\x02\x02\x02\xDD\xD5\x03\x02\x02\x02\xDD\xD6\x03\x02\x02\x02\xDD" + - "\xD8\x03\x02\x02\x02\xDD\xDA\x03\x02\x02\x02\xDD\xDB\x03\x02\x02\x02\xDD" + - "\xDC\x03\x02\x02\x02\xDE\x13\x03\x02\x02\x02\xDF\xE0\x07\x15\x02\x02\xE0" + - "\xE1\x05\x1C\x0F\x02\xE1\xE2\x07\x16\x02\x02\xE2\xE5\x054\x1B\x02\xE3" + - "\xE4\x07\x17\x02\x02\xE4\xE6\x05 \x11\x02\xE5\xE3\x03\x02\x02\x02\xE5" + - "\xE6\x03\x02\x02\x02\xE6\xF2\x03\x02\x02\x02\xE7\xE8\x07\x15\x02\x02\xE8" + - "\xEB\x05\x1C\x0F\x02\xE9\xEA\x07\x18\x02\x02\xEA\xEC\x05\x1C\x0F\x02\xEB" + - "\xE9\x03\x02\x02\x02\xEB\xEC\x03\x02\x02\x02\xEC\xEF\x03\x02\x02\x02\xED" + - "\xEE\x07\x17\x02\x02\xEE\xF0\x05 \x11\x02\xEF\xED\x03\x02\x02\x02\xEF" + - "\xF0\x03\x02\x02\x02\xF0\xF2\x03\x02\x02\x02\xF1\xDF\x03\x02\x02\x02\xF1" + - "\xE7\x03\x02\x02\x02\xF2\x15\x03\x02\x02\x02\xF3\xF4\x07\x19\x02\x02\xF4" + - "\xF5\x05\x1C\x0F\x02\xF5\xF6\x07\x16\x02\x02\xF6\xF7\x054\x1B\x02\xF7" + - "\xFF\x03\x02\x02\x02\xF8\xF9\x07\x19\x02\x02\xF9\xFC\x05\x1C\x0F\x02\xFA" + - "\xFB\x07\x18\x02\x02\xFB\xFD\x05\x1C\x0F\x02\xFC\xFA\x03\x02\x02\x02\xFC" + - "\xFD\x03\x02\x02\x02\xFD\xFF\x03\x02\x02\x02\xFE\xF3\x03\x02\x02\x02\xFE" + - "\xF8\x03\x02\x02\x02\xFF\x17\x03\x02\x02\x02\u0100\u0101\x07\x15\x02\x02" + - "\u0101\u0102\x05\x1A\x0E\x02\u0102\u0103\x07A\x02\x02\u0103\u0104\x05" + - "\x1C\x0F\x02\u0104\u0105\x07@\x02\x02\u0105\u010D\x05*\x16\x02\u0106\u0107" + - "\x07\n\x02\x02\u0107\u0108\x05\x1C\x0F\x02\u0108\u0109\x07@\x02\x02\u0109" + - "\u010A\x05*\x16\x02\u010A\u010C\x03\x02\x02\x02\u010B\u0106\x03\x02\x02" + - "\x02\u010C\u010F\x03\x02\x02\x02\u010D\u010B\x03\x02\x02\x02\u010D\u010E" + - "\x03\x02\x02\x02\u010E\u0110\x03\x02\x02\x02\u010F\u010D\x03\x02\x02\x02" + - "\u0110\u0111\x07B\x02\x02\u0111\u0112\x07\x16\x02\x02\u0112\u0115\x07" + - "7\x02\x02\u0113\u0114\x07\x17\x02\x02\u0114\u0116\x05 \x11\x02\u0115\u0113" + - "\x03\x02\x02\x02\u0115\u0116\x03\x02\x02\x02\u0116\u012F\x03\x02\x02\x02" + - "\u0117\u0118\x07\x15\x02\x02\u0118\u0119\x05\x1A\x0E\x02\u0119\u011A\x07" + - "A\x02\x02\u011A\u011B\x05\x1C\x0F\x02\u011B\u011C\x07@\x02\x02\u011C\u0124" + - "\x05*\x16\x02\u011D\u011E\x07\n\x02\x02\u011E\u011F\x05\x1C\x0F\x02\u011F" + - "\u0120\x07@\x02\x02\u0120\u0121\x05*\x16\x02\u0121\u0123\x03\x02\x02\x02" + - "\u0122\u011D\x03\x02\x02\x02\u0123\u0126\x03\x02\x02\x02\u0124\u0122\x03" + - "\x02\x02\x02\u0124\u0125\x03\x02\x02\x02\u0125\u0127\x03\x02\x02\x02\u0126" + - "\u0124\x03\x02\x02\x02\u0127\u0128\x07B\x02\x02\u0128\u0129\x07\x18\x02" + - "\x02\u0129\u012C\x05\x1E\x10\x02\u012A\u012B\x07\x17\x02\x02\u012B\u012D" + - "\x05 \x11\x02\u012C\u012A\x03\x02\x02\x02\u012C\u012D\x03\x02\x02\x02" + - "\u012D\u012F\x03\x02\x02\x02\u012E\u0100\x03\x02\x02\x02\u012E\u0117\x03" + - "\x02\x02\x02\u012F\x19\x03\x02\x02\x02\u0130\u0131\x05B\"\x02\u0131\x1B" + - "\x03\x02\x02\x02\u0132\u0133\x05B\"\x02\u0133\x1D\x03\x02\x02\x02\u0134" + - "\u0135\x05B\"\x02\u0135\x1F\x03\x02\x02\x02\u0136\u0137\x07*\x02\x02\u0137" + - "!\x03\x02\x02\x02\u0138\u0139\b\x12\x01\x02\u0139\u0142\x07A\x02\x02\u013A" + - "\u013F\x05\"\x12\x02\u013B\u013C\x07\n\x02\x02\u013C\u013E\x05\"\x12\x02" + - "\u013D\u013B\x03\x02\x02\x02\u013E\u0141\x03\x02\x02\x02\u013F\u013D\x03" + - "\x02\x02\x02\u013F\u0140\x03\x02\x02\x02\u0140\u0143\x03\x02\x02\x02\u0141" + - "\u013F\x03\x02\x02\x02\u0142\u013A\x03\x02\x02\x02\u0142\u0143\x03\x02" + - "\x02\x02\u0143\u0145\x03\x02\x02\x02\u0144\u0146\x07\n\x02\x02\u0145\u0144" + - "\x03\x02\x02\x02\u0145\u0146\x03\x02\x02\x02\u0146\u0147\x03\x02\x02\x02" + - "\u0147\u0148\x07B\x02\x02\u0148\u0149\x07\x1B\x02\x02\u0149\u0176\x05" + - "\"\x12\r\u014A\u014B\x071\x02\x02\u014B\u014C\x07\x1C\x02\x02\u014C\u014D" + - "\x05\"\x12\x02\u014D\u014E\x07\x1D\x02\x02\u014E\u0176\x03\x02\x02\x02" + - "\u014F\u0150\x072\x02\x02\u0150\u0151\x07\x1C\x02\x02\u0151\u0152\x05" + - "\"\x12\x02\u0152\u0153\x07\x1D\x02\x02\u0153\u0176\x03\x02\x02\x02\u0154" + - "\u0155\x07A\x02\x02\u0155\u0156\x05\"\x12\x02\u0156\u0157\x07\n\x02\x02" + - "\u0157\u015C\x05\"\x12\x02\u0158\u0159\x07\n\x02\x02\u0159\u015B\x05\"" + - "\x12\x02\u015A\u0158\x03\x02\x02\x02\u015B\u015E\x03\x02\x02\x02\u015C" + - "\u015A\x03\x02\x02\x02\u015C\u015D\x03\x02\x02\x02\u015D\u0160\x03\x02" + - "\x02\x02\u015E\u015C\x03\x02\x02\x02\u015F\u0161\x07\n\x02\x02\u0160\u015F" + - "\x03\x02\x02\x02\u0160\u0161\x03\x02\x02\x02\u0161\u0162\x03\x02\x02\x02" + - "\u0162\u0163\x07B\x02\x02\u0163\u0176\x03\x02\x02\x02\u0164\u0165\x07" + - "\x04\x02\x02\u0165\u0166\x05&\x14\x02\u0166\u0167\x07\x05\x02\x02\u0167" + - "\u0176\x03\x02\x02\x02\u0168\u016A\x05$\x13\x02\u0169\u0168\x03\x02\x02" + - "\x02\u016A\u016B\x03\x02\x02\x02\u016B\u0169\x03\x02\x02\x02\u016B\u016C" + - "\x03\x02\x02\x02\u016C\u0176\x03\x02\x02\x02\u016D\u0176\x07\x1E\x02\x02" + - "\u016E\u0176\x07\x1F\x02\x02\u016F\u0176\x07 \x02\x02\u0170\u0176\x05" + - "B\"\x02\u0171\u0172\x07A\x02\x02\u0172\u0173\x05\"\x12\x02\u0173\u0174" + - "\x07B\x02\x02\u0174\u0176\x03\x02\x02\x02\u0175\u0138\x03\x02\x02\x02" + - "\u0175\u014A\x03\x02\x02\x02\u0175\u014F\x03\x02\x02\x02\u0175\u0154\x03" + - "\x02\x02\x02\u0175\u0164\x03\x02\x02\x02\u0175\u0169\x03\x02\x02\x02\u0175" + - "\u016D\x03\x02\x02\x02\u0175\u016E\x03\x02\x02\x02\u0175\u016F\x03\x02" + - "\x02\x02\u0175\u0170\x03\x02\x02\x02\u0175\u0171\x03\x02\x02\x02\u0176" + - "\u017F\x03\x02\x02\x02\u0177\u0178\f\x0F\x02\x02\u0178\u0179\x07\x1A\x02" + - "\x02\u0179\u017E\x05\"\x12\x0F\u017A\u017B\f\x0E\x02\x02\u017B\u017C\x07" + - "\x1B\x02\x02\u017C\u017E\x05\"\x12\x0E\u017D\u0177\x03\x02\x02\x02\u017D" + - "\u017A\x03\x02\x02\x02\u017E\u0181\x03\x02\x02\x02\u017F\u017D\x03\x02" + - "\x02\x02\u017F\u0180\x03\x02\x02\x02\u0180#\x03\x02\x02\x02\u0181\u017F" + - "\x03\x02\x02\x02\u0182\u0183\x07\r\x02\x02\u0183\u0184\x07\x04\x02\x02" + - "\u0184\u0185\x05B\"\x02\u0185\u0186\x07\x07\x02\x02\u0186\u0189\x07*\x02" + - "\x02\u0187\u0188\x07\n\x02\x02\u0188\u018A\x05&\x14\x02\u0189\u0187\x03" + - "\x02\x02\x02\u0189\u018A\x03\x02\x02\x02\u018A\u018C\x03\x02\x02\x02\u018B" + - "\u018D\x07\n\x02\x02\u018C\u018B\x03\x02\x02\x02\u018C\u018D\x03\x02\x02" + - "\x02\u018D\u018E\x03\x02\x02\x02\u018E\u018F\x07\x05\x02\x02\u018F%\x03" + - "\x02\x02\x02\u0190\u0191\x05(\x15\x02\u0191\u0192\x07\x07\x02\x02\u0192" + - "\u0193\x05\"\x12\x02\u0193\u0194\x07\n\x02\x02\u0194\u0196\x03\x02\x02" + - "\x02\u0195\u0190\x03\x02\x02\x02\u0196\u0199\x03\x02\x02\x02\u0197\u0195" + - "\x03\x02\x02\x02\u0197\u0198\x03\x02\x02\x02\u0198\u01A3\x03\x02\x02\x02" + - "\u0199\u0197\x03\x02\x02\x02\u019A\u019B\x05(\x15\x02\u019B\u019C\x07" + - "\x07\x02\x02\u019C\u019D\x05\"\x12\x02\u019D\u01A1\x03\x02\x02\x02\u019E" + - "\u01A2\x07\n\x02\x02\u019F\u01A0\x07\r\x02\x02\u01A0\u01A2\x07C\x02\x02" + - "\u01A1\u019E\x03\x02\x02\x02\u01A1\u019F\x03\x02\x02\x02\u01A1\u01A2\x03" + - "\x02\x02\x02\u01A2\u01A4\x03\x02\x02\x02\u01A3\u019A\x03\x02\x02\x02\u01A3" + - "\u01A4\x03\x02\x02\x02\u01A4\u01A8\x03\x02\x02\x02\u01A5\u01A6\x07\r\x02" + - "\x02\u01A6\u01A8\x07C\x02\x02\u01A7\u0197\x03\x02\x02\x02\u01A7\u01A5" + - "\x03\x02\x02\x02\u01A8\'\x03\x02\x02\x02\u01A9\u01AA\x05D#\x02\u01AA)" + - "\x03\x02\x02\x02\u01AB\u01AC\b\x16\x01\x02\u01AC\u0241\x05.\x18\x02\u01AD" + - "\u01AE\x05:\x1E\x02\u01AE\u01B0\x07A\x02\x02\u01AF\u01B1\x056\x1C\x02" + - "\u01B0\u01AF\x03\x02\x02\x02\u01B0\u01B1\x03\x02\x02\x02\u01B1\u01B2\x03" + - "\x02\x02\x02\u01B2\u01B3\x07B\x02\x02\u01B3\u0241\x03\x02\x02\x02\u01B4" + - "\u01B5\x076\x02\x02\u01B5\u0241\x05*\x16\x1B\u01B6\u01B7\x05B\"\x02\u01B7" + - "\u01B8\x07\"\x02\x02\u01B8\u01B9\x07@\x02\x02\u01B9\u01BA\x05*\x16\x17" + - "\u01BA\u0241\x03\x02\x02\x02\u01BB\u01BC\x07-\x02\x02\u01BC\u01BD\x07" + - "\x04\x02\x02\u01BD\u01C2\x05*\x16\x02\u01BE\u01BF\x07\n\x02\x02\u01BF" + - "\u01C1\x05*\x16\x02\u01C0\u01BE\x03\x02\x02\x02\u01C1\u01C4\x03\x02\x02" + - "\x02\u01C2\u01C0\x03\x02\x02\x02\u01C2\u01C3\x03\x02\x02\x02\u01C3\u01C6" + - "\x03\x02\x02\x02\u01C4\u01C2\x03\x02\x02\x02\u01C5\u01C7\x07\n\x02\x02" + - "\u01C6\u01C5\x03\x02\x02\x02\u01C6\u01C7\x03\x02\x02\x02\u01C7\u01C8\x03" + - "\x02\x02\x02\u01C8\u01C9\x07\x05\x02\x02\u01C9\u0241\x03\x02\x02\x02\u01CA" + - "\u01CB\x07.\x02\x02\u01CB\u01CC\x07\x04\x02\x02\u01CC\u01D1\x05*\x16\x02" + - "\u01CD\u01CE\x07\n\x02\x02\u01CE\u01D0\x05*\x16\x02\u01CF\u01CD\x03\x02" + - "\x02\x02\u01D0\u01D3\x03\x02\x02\x02\u01D1\u01CF\x03\x02\x02\x02\u01D1" + - "\u01D2\x03\x02\x02\x02\u01D2\u01D5\x03\x02\x02\x02\u01D3\u01D1\x03\x02" + - "\x02\x02\u01D4\u01D6\x07\n\x02\x02\u01D5\u01D4\x03\x02\x02\x02\u01D5\u01D6" + - "\x03\x02\x02\x02\u01D6\u01D7\x03\x02\x02\x02\u01D7\u01D8\x07\x05\x02\x02" + - "\u01D8\u0241\x03\x02\x02\x02\u01D9\u01DA\x07#\x02\x02\u01DA\u01DB\x07" + - "\x04\x02\x02\u01DB\u01E0\x05*\x16\x02\u01DC\u01DD\x07\n\x02\x02\u01DD" + - "\u01DF\x05*\x16\x02\u01DE\u01DC\x03\x02\x02\x02\u01DF\u01E2\x03\x02\x02" + - "\x02\u01E0\u01DE\x03\x02\x02\x02\u01E0\u01E1\x03\x02\x02\x02\u01E1\u01E4" + - "\x03\x02\x02\x02\u01E2\u01E0\x03\x02\x02\x02\u01E3\u01E5\x07\n\x02\x02" + - "\u01E4\u01E3\x03\x02\x02\x02\u01E4\u01E5\x03\x02\x02\x02\u01E5\u01E6\x03" + - "\x02\x02\x02\u01E6\u01E7\x07\x05\x02\x02\u01E7\u0241\x03\x02\x02\x02\u01E8" + - "\u01E9\x07$\x02\x02\u01E9\u01EA\x07\x04\x02\x02\u01EA\u01EF\x05*\x16\x02" + - "\u01EB\u01EC\x07\n\x02\x02\u01EC\u01EE\x05*\x16\x02\u01ED\u01EB\x03\x02" + - "\x02\x02\u01EE\u01F1\x03\x02\x02\x02\u01EF\u01ED\x03\x02\x02\x02\u01EF" + - "\u01F0\x03\x02\x02\x02\u01F0\u01F3\x03\x02\x02\x02\u01F1\u01EF\x03\x02" + - "\x02\x02\u01F2\u01F4\x07\n\x02\x02\u01F3\u01F2\x03\x02\x02\x02\u01F3\u01F4" + - "\x03\x02\x02\x02\u01F4\u01F5\x03\x02\x02\x02\u01F5\u01F6\x07\x05\x02\x02" + - "\u01F6\u0241\x03\x02\x02\x02\u01F7\u01FC\x05B\"\x02\u01F8\u01FC\x07,\x02" + - "\x02\u01F9\u01FC\x07+\x02\x02\u01FA\u01FC\x07*\x02\x02\u01FB\u01F7\x03" + - "\x02\x02\x02\u01FB\u01F8\x03\x02\x02\x02\u01FB\u01F9\x03\x02\x02\x02\u01FB" + - "\u01FA\x03\x02\x02\x02\u01FC\u0241\x03\x02\x02\x02\u01FD\u01FE\x07"; + "\x03\x16\x05\x16\u0248\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\x05\x16\u026F\n\x16\x03\x16\x05\x16" + + "\u0272\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\x06\x16\u0282\n\x16" + + "\r\x16\x0E\x16\u0283\x07\x16\u0286\n\x16\f\x16\x0E\x16\u0289\v\x16\x03" + + "\x17\x03\x17\x03\x17\x03\x17\x05\x17\u028F\n\x17\x03\x17\x03\x17\x03\x17" + + "\x07\x17\u0294\n\x17\f\x17\x0E\x17\u0297\v\x17\x03\x17\x03\x17\x03\x18" + + "\x03\x18\x05\x18\u029D\n\x18\x03\x18\x03\x18\x03\x18\x03\x19\x03\x19\x03" + + "\x19\x03\x19\x05\x19\u02A6\n\x19\x03\x19\x05\x19\u02A9\n\x19\x03\x1A\x03" + + "\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x03\x1A\x05\x1A\u02B4" + + "\n\x1A\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B\x03\x1B" + + "\x07\x1B\u02BE\n\x1B\f\x1B\x0E\x1B\u02C1\v\x1B\x03\x1B\x03\x1B\x03\x1B" + + "\x03\x1B\x05\x1B\u02C7\n\x1B\x03\x1C\x03\x1C\x05\x1C\u02CB\n\x1C\x03\x1D" + + "\x03\x1D\x03\x1E\x03\x1E\x05\x1E\u02D1\n\x1E\x03\x1F\x03\x1F\x03\x1F\x07" + + "\x1F\u02D6\n\x1F\f\x1F\x0E\x1F\u02D9\v\x1F\x03 \x03 \x03 \x03 \x03 \x03" + + " \x05 \u02E1\n \x03!\x03!\x05!\u02E5\n!\x03\"\x03\"\x05\"\u02E9\n\"\x03" + + "#\x03#\x03$\x03$\x03%\x03%\x03%\x07%\u02F2\n%\f%\x0E%\u02F5\v%\x03&\x03" + + "&\x03&\x03&\x05&\u02FB\n&\x03&\x02\x02\x04\"*\'\x02\x02\x04\x02\x06\x02" + + "\b\x02\n\x02\f\x02\x0E\x02\x10\x02\x12\x02\x14\x02\x16\x02\x18\x02\x1A" + + "\x02\x1C\x02\x1E\x02 \x02\"\x02$\x02&\x02(\x02*\x02,\x02.\x020\x022\x02" + + "4\x026\x028\x02:\x02<\x02>\x02@\x02B\x02D\x02F\x02H\x02J\x02\x02\t\x03" + + "\x0279\x03\x0256\x03\x02:?\x03\x02-3\x03\x02-0\x05\x02!!-05?\x03\x02*" + + ",\x02\u0362\x02M\x03\x02\x02\x02\x04V\x03\x02\x02\x02\x06g\x03\x02\x02" + + "\x02\b\x80\x03\x02\x02\x02\n\x82\x03\x02\x02\x02\f\xC6\x03\x02\x02\x02" + + "\x0E\xC8\x03\x02\x02\x02\x10\xCF\x03\x02\x02\x02\x12\xE3\x03\x02\x02\x02" + + "\x14\xF7\x03\x02\x02\x02\x16\u0104\x03\x02\x02\x02\x18\u0134\x03\x02\x02" + + "\x02\x1A\u0136\x03\x02\x02\x02\x1C\u0138\x03\x02\x02\x02\x1E\u013A\x03" + + "\x02\x02\x02 \u013C\x03\x02\x02\x02\"\u017B\x03\x02\x02\x02$\u0188\x03" + + "\x02\x02\x02&\u01AD\x03\x02\x02\x02(\u01AF\x03\x02\x02\x02*\u0247\x03" + + "\x02\x02\x02,\u028A\x03\x02\x02\x02.\u029C\x03\x02\x02\x020\u02A1\x03" + + "\x02\x02\x022\u02B3\x03\x02\x02\x024\u02C6\x03\x02\x02\x026\u02CA\x03" + + "\x02\x02\x028\u02CC\x03\x02\x02\x02:\u02D0\x03\x02\x02\x02<\u02D2\x03" + + "\x02\x02\x02>\u02E0\x03\x02\x02\x02@\u02E4\x03\x02\x02\x02B\u02E8\x03" + + "\x02\x02\x02D\u02EA\x03\x02\x02\x02F\u02EC\x03\x02\x02\x02H\u02EE\x03" + + "\x02\x02\x02J\u02FA\x03\x02\x02\x02LN\x05\x04\x03\x02ML\x03\x02\x02\x02" + + "NO\x03\x02\x02\x02OM\x03\x02\x02\x02OP\x03\x02\x02\x02PQ\x03\x02\x02\x02" + + "QR\x07\x02\x02\x03R\x03\x03\x02\x02\x02SU\x07D\x02\x02TS\x03\x02\x02\x02" + + "UX\x03\x02\x02\x02VT\x03\x02\x02\x02VW\x03\x02\x02\x02WY\x03\x02\x02\x02" + + "XV\x03\x02\x02\x02YZ\x07\x03\x02\x02Z[\x05H%\x02[_\x07\x04\x02\x02\\^" + + "\x05\x06\x04\x02]\\\x03\x02\x02\x02^a\x03\x02\x02\x02_]\x03\x02\x02\x02" + + "_`\x03\x02\x02\x02`b\x03\x02\x02\x02a_\x03\x02\x02\x02bc\x07\x05\x02\x02" + + "c\x05\x03\x02\x02\x02df\x07D\x02\x02ed\x03\x02\x02\x02fi\x03\x02\x02\x02" + + "ge\x03\x02\x02\x02gh\x03\x02\x02\x02hj\x03\x02\x02\x02ig\x03\x02\x02\x02" + + "jk\x05\b\x05\x02k\x07\x03\x02\x02\x02lm\x07\x06\x02\x02mn\x05H%\x02no" + + "\x07\x07\x02\x02op\x05\"\x12\x02p\x81\x03\x02\x02\x02qr\x07\b\x02\x02" + + "rs\x05H%\x02st\x07\x07\x02\x02tu\x05\"\x12\x02u\x81\x03\x02\x02\x02vw" + + "\x07\t\x02\x02wx\x056\x1C\x02xy\x07@\x02\x02yz\x05*\x16\x02z\x81\x03\x02" + + "\x02\x02{\x81\x05\x18\r\x02|\x81\x05\n\x06\x02}\x81\x05\f\x07\x02~\x81" + + "\x05\x14\v\x02\x7F\x81\x05\x16\f\x02\x80l\x03\x02\x02\x02\x80q\x03\x02" + + "\x02\x02\x80v\x03\x02\x02\x02\x80{\x03\x02\x02\x02\x80|\x03\x02\x02\x02" + + "\x80}\x03\x02\x02\x02\x80~\x03\x02\x02\x02\x80\x7F\x03\x02\x02\x02\x81" + + "\t\x03\x02\x02\x02\x82\x83\x05\x12\n\x02\x83\xA8\x05@!\x02\x84\x8D\x07" + + "A\x02\x02\x85\x8A\x058\x1D\x02\x86\x87\x07\n\x02\x02\x87\x89\x058\x1D" + + "\x02\x88\x86\x03\x02\x02\x02\x89\x8C\x03\x02\x02\x02\x8A\x88\x03\x02\x02" + + "\x02\x8A\x8B\x03\x02\x02\x02\x8B\x8E\x03\x02\x02\x02\x8C\x8A\x03\x02\x02" + + "\x02\x8D\x85\x03\x02\x02\x02\x8D\x8E\x03\x02\x02\x02\x8E\x8F\x03\x02\x02" + + "\x02\x8F\x92\x07B\x02\x02\x90\x91\x07\x07\x02\x02\x91\x93\x05\"\x12\x02" + + "\x92\x90\x03\x02\x02\x02\x92\x93\x03\x02\x02\x02\x93\xA9\x03\x02\x02\x02" + + "\x94\x95\x07\x07\x02\x02\x95\xA9\x05\"\x12\x02\x96\x97\x07A\x02\x02\x97" + + "\x98\x058\x1D\x02\x98\x99\x07\x07\x02\x02\x99\xA1\x05\"\x12\x02\x9A\x9B" + + "\x07\n\x02\x02\x9B\x9C\x058\x1D\x02\x9C\x9D\x07\x07\x02\x02\x9D\x9E\x05" + + "\"\x12\x02\x9E\xA0\x03\x02\x02\x02\x9F\x9A\x03\x02\x02\x02\xA0\xA3\x03" + + "\x02\x02\x02\xA1\x9F\x03\x02\x02\x02\xA1\xA2\x03\x02\x02\x02\xA2\xA4\x03" + + "\x02\x02\x02\xA3\xA1\x03\x02\x02\x02\xA4\xA5\x07B\x02\x02\xA5\xA6\x07" + + "\x07\x02\x02\xA6\xA7\x05\"\x12\x02\xA7\xA9\x03\x02\x02\x02\xA8\x84\x03" + + "\x02\x02\x02\xA8\x94\x03\x02\x02\x02\xA8\x96\x03\x02\x02\x02\xA8\xA9\x03" + + "\x02\x02\x02\xA9\xAC\x03\x02\x02\x02\xAA\xAB\x07@\x02\x02\xAB\xAD\x05" + + "*\x16\x02\xAC\xAA\x03\x02\x02\x02\xAC\xAD\x03\x02\x02\x02\xAD\xAF\x03" + + "\x02\x02\x02\xAE\xB0\x07\v\x02\x02\xAF\xAE\x03\x02\x02\x02\xAF\xB0\x03" + + "\x02\x02\x02\xB0\v\x03\x02\x02\x02\xB1\xB2\x07\f\x02\x02\xB2\xC7\x05H" + + "%\x02\xB3\xB4\x07\f\x02\x02\xB4\xB5\x05H%\x02\xB5\xB6\x07@\x02\x02\xB6" + + "\xB7\x05\"\x12\x02\xB7\xC7\x03\x02\x02\x02\xB8\xB9\x07\f\x02\x02\xB9\xBA" + + "\x05H%\x02\xBA\xBC\x07@\x02\x02\xBB\xBD\x07\r\x02\x02\xBC\xBB\x03\x02" + + "\x02\x02\xBC\xBD\x03\x02\x02\x02\xBD\xBE\x03\x02\x02\x02\xBE\xC3\x05\x0E" + + "\b\x02\xBF\xC0\x07\r\x02\x02\xC0\xC2\x05\x0E\b\x02\xC1\xBF\x03\x02\x02" + + "\x02\xC2\xC5\x03\x02\x02\x02\xC3\xC1\x03\x02\x02\x02\xC3\xC4\x03\x02\x02" + + "\x02\xC4\xC7\x03\x02\x02\x02\xC5\xC3\x03\x02\x02\x02\xC6\xB1\x03\x02\x02" + + "\x02\xC6\xB3\x03\x02\x02\x02\xC6\xB8\x03\x02\x02\x02\xC7\r\x03\x02\x02" + + "\x02\xC8\xCD\x05J&\x02\xC9\xCA\x07A\x02\x02\xCA\xCB\x05\"\x12\x02\xCB" + + "\xCC\x07B\x02\x02\xCC\xCE\x03\x02\x02\x02\xCD\xC9\x03\x02\x02\x02\xCD" + + "\xCE\x03\x02\x02\x02\xCE\x0F\x03\x02\x02\x02\xCF\xD0\x07\x0E\x02\x02\xD0" + + "\xD3\x05H%\x02\xD1\xD2\x07\x07\x02\x02\xD2\xD4\x05\"\x12\x02\xD3\xD1\x03" + + "\x02\x02\x02\xD3\xD4\x03\x02\x02\x02\xD4\xD5\x03\x02\x02\x02\xD5\xD6\x07" + + "@\x02\x02\xD6\xD8\x05*\x16\x02\xD7\xD9\x07\v\x02\x02\xD8\xD7\x03\x02\x02" + + "\x02\xD8\xD9\x03\x02\x02\x02\xD9\x11\x03\x02\x02\x02\xDA\xE4\x07\x0F\x02" + + "\x02\xDB\xE4\x07\x10\x02\x02\xDC\xDD\x07\x11\x02\x02\xDD\xE4\x07\x0F\x02" + + "\x02\xDE\xDF\x07\x11\x02\x02\xDF\xE4\x07\x10\x02\x02\xE0\xE4\x07\x12\x02" + + "\x02\xE1\xE4\x07\x13\x02\x02\xE2\xE4\x07\x14\x02\x02\xE3\xDA\x03\x02\x02" + + "\x02\xE3\xDB\x03\x02\x02\x02\xE3\xDC\x03\x02\x02\x02\xE3\xDE\x03\x02\x02" + + "\x02\xE3\xE0\x03\x02\x02\x02\xE3\xE1\x03\x02\x02\x02\xE3\xE2\x03\x02\x02" + + "\x02\xE4\x13\x03\x02\x02\x02\xE5\xE6\x07\x15\x02\x02\xE6\xE7\x05\x1C\x0F" + + "\x02\xE7\xE8\x07\x16\x02\x02\xE8\xEB\x05:\x1E\x02\xE9\xEA\x07\x17\x02" + + "\x02\xEA\xEC\x05 \x11\x02\xEB\xE9\x03\x02\x02\x02\xEB\xEC\x03\x02\x02" + + "\x02\xEC\xF8\x03\x02\x02\x02\xED\xEE\x07\x15\x02\x02\xEE\xF1\x05\x1C\x0F" + + "\x02\xEF\xF0\x07\x18\x02\x02\xF0\xF2\x05\x1C\x0F\x02\xF1\xEF\x03\x02\x02" + + "\x02\xF1\xF2\x03\x02\x02\x02\xF2\xF5\x03\x02\x02\x02\xF3\xF4\x07\x17\x02" + + "\x02\xF4\xF6\x05 \x11\x02\xF5\xF3\x03\x02\x02\x02\xF5\xF6\x03\x02\x02" + + "\x02\xF6\xF8\x03\x02\x02\x02\xF7\xE5\x03\x02\x02\x02\xF7\xED\x03\x02\x02" + + "\x02\xF8\x15\x03\x02\x02\x02\xF9\xFA\x07\x19\x02\x02\xFA\xFB\x05\x1C\x0F" + + "\x02\xFB\xFC\x07\x16\x02\x02\xFC\xFD\x05:\x1E\x02\xFD\u0105\x03\x02\x02" + + "\x02\xFE\xFF\x07\x19\x02\x02\xFF\u0102\x05\x1C\x0F\x02\u0100\u0101\x07" + + "\x18\x02\x02\u0101\u0103\x05\x1C\x0F\x02\u0102\u0100\x03\x02\x02\x02\u0102" + + "\u0103\x03\x02\x02\x02\u0103\u0105\x03\x02\x02\x02\u0104\xF9\x03\x02\x02" + + "\x02\u0104\xFE\x03\x02\x02\x02\u0105\x17\x03\x02\x02\x02\u0106\u0107\x07" + + "\x15\x02\x02\u0107\u0108\x05\x1A\x0E\x02\u0108\u0109\x07A\x02\x02\u0109" + + "\u010A\x05\x1C\x0F\x02\u010A\u010B\x07@\x02\x02\u010B\u0113\x05*\x16\x02" + + "\u010C\u010D\x07\n\x02\x02\u010D\u010E\x05\x1C\x0F\x02\u010E\u010F\x07" + + "@\x02\x02\u010F\u0110\x05*\x16\x02\u0110\u0112\x03\x02\x02\x02\u0111\u010C" + + "\x03\x02\x02\x02\u0112\u0115\x03\x02\x02\x02\u0113\u0111\x03\x02\x02\x02" + + "\u0113\u0114\x03\x02\x02\x02\u0114\u0116\x03\x02\x02\x02\u0115\u0113\x03" + + "\x02\x02\x02\u0116\u0117\x07B\x02\x02\u0117\u0118\x07\x16\x02\x02\u0118" + + "\u011B\x077\x02\x02\u0119\u011A\x07\x17\x02\x02\u011A\u011C\x05 \x11\x02" + + "\u011B\u0119\x03\x02\x02\x02\u011B\u011C\x03\x02\x02\x02\u011C\u0135\x03" + + "\x02\x02\x02\u011D\u011E\x07\x15\x02\x02\u011E\u011F\x05\x1A\x0E\x02\u011F" + + "\u0120\x07A\x02\x02\u0120\u0121\x05\x1C\x0F\x02\u0121\u0122\x07@\x02\x02" + + "\u0122\u012A\x05*\x16\x02\u0123\u0124\x07\n\x02\x02\u0124\u0125\x05\x1C" + + "\x0F\x02\u0125\u0126\x07@\x02\x02\u0126\u0127\x05*\x16\x02\u0127\u0129" + + "\x03\x02\x02\x02\u0128\u0123\x03\x02\x02\x02\u0129\u012C\x03\x02\x02\x02" + + "\u012A\u0128\x03\x02\x02\x02\u012A\u012B\x03\x02\x02\x02\u012B\u012D\x03" + + "\x02\x02\x02\u012C\u012A\x03\x02\x02\x02\u012D\u012E\x07B\x02\x02\u012E" + + "\u012F\x07\x18\x02\x02\u012F\u0132\x05\x1E\x10\x02\u0130\u0131\x07\x17" + + "\x02\x02\u0131\u0133\x05 \x11\x02\u0132\u0130\x03\x02\x02\x02\u0132\u0133" + + "\x03\x02\x02\x02\u0133\u0135\x03\x02\x02\x02\u0134\u0106\x03\x02\x02\x02" + + "\u0134\u011D\x03\x02\x02\x02\u0135\x19\x03\x02\x02\x02\u0136\u0137\x05" + + "H%\x02\u0137\x1B\x03\x02\x02\x02\u0138\u0139\x05H%\x02\u0139\x1D\x03\x02" + + "\x02\x02\u013A\u013B\x05H%\x02\u013B\x1F\x03\x02\x02\x02\u013C\u013D\x07" + + "*\x02\x02\u013D!\x03\x02\x02\x02\u013E\u013F\b\x12\x01\x02\u013F\u0148" + + "\x07A\x02\x02\u0140\u0145\x05\"\x12\x02\u0141\u0142\x07\n\x02\x02\u0142" + + "\u0144\x05\"\x12\x02\u0143\u0141\x03\x02\x02\x02\u0144\u0147\x03\x02\x02" + + "\x02\u0145\u0143\x03\x02\x02\x02\u0145\u0146\x03\x02\x02\x02\u0146\u0149" + + "\x03\x02\x02\x02\u0147\u0145\x03\x02\x02\x02\u0148\u0140\x03\x02\x02\x02" + + "\u0148\u0149\x03\x02\x02\x02\u0149\u014B\x03\x02\x02\x02\u014A\u014C\x07" + + "\n\x02\x02\u014B\u014A\x03\x02\x02\x02\u014B\u014C\x03\x02\x02\x02\u014C" + + "\u014D\x03\x02\x02\x02\u014D\u014E\x07B\x02\x02\u014E\u014F\x07\x1B\x02" + + "\x02\u014F\u017C\x05\"\x12\r\u0150\u0151\x071\x02\x02\u0151\u0152\x07" + + "\x1C\x02\x02\u0152\u0153\x05\"\x12\x02\u0153\u0154\x07\x1D\x02\x02\u0154" + + "\u017C\x03\x02\x02\x02\u0155\u0156\x072\x02\x02\u0156\u0157\x07\x1C\x02" + + "\x02\u0157\u0158\x05\"\x12\x02\u0158\u0159\x07\x1D\x02\x02\u0159\u017C" + + "\x03\x02\x02\x02\u015A\u015B\x07A\x02\x02\u015B\u015C\x05\"\x12\x02\u015C" + + "\u015D\x07\n\x02\x02\u015D\u0162\x05\"\x12\x02\u015E\u015F\x07\n\x02\x02" + + "\u015F\u0161\x05\"\x12\x02\u0160\u015E\x03\x02\x02\x02\u0161\u0164\x03" + + "\x02\x02\x02\u0162\u0160\x03\x02\x02\x02\u0162\u0163\x03\x02\x02\x02\u0163" + + "\u0166\x03\x02\x02\x02\u0164\u0162\x03\x02\x02\x02\u0165\u0167\x07\n\x02" + + "\x02\u0166\u0165\x03\x02\x02\x02\u0166\u0167\x03\x02\x02\x02\u0167\u0168" + + "\x03\x02\x02\x02\u0168\u0169\x07B\x02\x02\u0169\u017C\x03\x02\x02\x02" + + "\u016A\u016B\x07\x04\x02\x02\u016B\u016C\x05&\x14\x02\u016C\u016D\x07" + + "\x05\x02\x02\u016D\u017C\x03\x02\x02\x02\u016E\u0170\x05$\x13\x02\u016F" + + "\u016E\x03\x02\x02\x02\u0170\u0171\x03\x02\x02\x02\u0171\u016F\x03\x02" + + "\x02\x02\u0171\u0172\x03\x02\x02\x02\u0172\u017C\x03\x02\x02\x02\u0173" + + "\u017C\x07\x1E\x02\x02\u0174\u017C\x07\x1F\x02\x02\u0175\u017C\x07 \x02" + + "\x02\u0176\u017C\x05H%\x02\u0177\u0178\x07A\x02\x02\u0178\u0179\x05\"" + + "\x12\x02\u0179\u017A\x07B\x02\x02\u017A\u017C\x03\x02\x02\x02\u017B\u013E" + + "\x03\x02\x02\x02\u017B\u0150\x03\x02\x02\x02\u017B\u0155\x03\x02\x02\x02" + + "\u017B\u015A\x03\x02\x02\x02\u017B\u016A\x03\x02\x02\x02\u017B\u016F\x03" + + "\x02\x02\x02\u017B\u0173\x03\x02\x02\x02\u017B\u0174\x03\x02\x02\x02\u017B" + + "\u0175\x03\x02\x02\x02\u017B\u0176\x03\x02\x02\x02\u017B\u0177\x03\x02" + + "\x02\x02\u017C\u0185\x03\x02\x02\x02\u017D\u017E\f\x0F\x02\x02\u017E\u017F" + + "\x07\x1A\x02\x02\u017F\u0184\x05\"\x12\x0F\u0180\u0181\f\x0E\x02\x02\u0181" + + "\u0182\x07\x1B\x02\x02\u0182\u0184\x05\"\x12\x0E\u0183\u017D\x03\x02\x02" + + "\x02\u0183\u0180\x03\x02\x02\x02\u0184\u0187\x03\x02\x02\x02\u0185\u0183" + + "\x03\x02\x02\x02\u0185\u0186\x03\x02\x02\x02\u0186#\x03\x02\x02\x02\u0187" + + "\u0185\x03\x02\x02\x02\u0188\u0189\x07\r\x02\x02\u0189\u018A\x07\x04\x02" + + "\x02\u018A\u018B\x05H%\x02\u018B\u018C\x07\x07\x02\x02\u018C\u018F\x07" + + "*\x02\x02\u018D\u018E\x07\n\x02\x02\u018E\u0190\x05&\x14\x02\u018F\u018D" + + "\x03\x02\x02\x02\u018F\u0190\x03\x02\x02\x02\u0190\u0192\x03\x02\x02\x02" + + "\u0191\u0193\x07\n\x02\x02\u0192\u0191\x03\x02\x02\x02\u0192\u0193\x03" + + "\x02\x02\x02\u0193\u0194\x03\x02\x02\x02\u0194\u0195\x07\x05\x02\x02\u0195" + + "%\x03\x02\x02\x02\u0196\u0197\x05(\x15\x02\u0197\u0198\x07\x07\x02\x02" + + "\u0198\u0199\x05\"\x12\x02\u0199\u019A\x07\n\x02\x02\u019A\u019C\x03\x02" + + "\x02\x02\u019B\u0196\x03\x02\x02\x02\u019C\u019F\x03\x02\x02\x02\u019D" + + "\u019B\x03\x02\x02\x02\u019D\u019E\x03\x02\x02\x02\u019E\u01A9\x03\x02" + + "\x02\x02\u019F\u019D\x03\x02\x02\x02\u01A0\u01A1\x05(\x15\x02\u01A1\u01A2" + + "\x07\x07\x02\x02\u01A2\u01A3\x05\"\x12\x02\u01A3\u01A7\x03\x02\x02\x02" + + "\u01A4\u01A8\x07\n\x02\x02\u01A5\u01A6\x07\r\x02\x02\u01A6\u01A8\x07C" + + "\x02\x02\u01A7\u01A4\x03\x02\x02\x02\u01A7\u01A5\x03\x02\x02\x02\u01A7" + + "\u01A8\x03\x02\x02\x02\u01A8\u01AA\x03\x02\x02\x02\u01A9\u01A0\x03\x02" + + "\x02\x02\u01A9\u01AA\x03\x02\x02\x02\u01AA\u01AE\x03\x02\x02\x02\u01AB" + + "\u01AC\x07\r\x02\x02\u01AC\u01AE\x07C\x02\x02\u01AD\u019D\x03\x02\x02" + + "\x02\u01AD\u01AB\x03\x02\x02\x02\u01AE\'\x03\x02\x02\x02\u01AF\u01B0\x05" + + "J&\x02\u01B0)\x03\x02\x02\x02\u01B1\u01B2\b\x16\x01\x02\u01B2\u0248\x05" + + "4\x1B\x02\u01B3\u01B4\x05@!\x02\u01B4\u01B6\x07A\x02\x02\u01B5\u01B7\x05" + + "<\x1F\x02\u01B6\u01B5\x03\x02\x02\x02\u01B6\u01B7\x03\x02\x02\x02\u01B7" + + "\u01B8\x03\x02\x02\x02\u01B8\u01B9\x07B\x02\x02\u01B9\u0248\x03\x02\x02" + + "\x02\u01BA\u01BB\x076\x02\x02\u01BB\u0248\x05*\x16\x1C\u01BC\u01BD\x05" + + "H%\x02\u01BD\u01BE\x07\"\x02\x02\u01BE\u01BF\x07@\x02\x02\u01BF\u01C0" + + "\x05*\x16\x18\u01C0\u0248\x03\x02\x02\x02\u01C1\u01C2\x07-\x02\x02\u01C2" + + "\u01C3\x07\x04\x02\x02\u01C3\u01C8\x05*\x16\x02\u01C4\u01C5\x07\n\x02" + + "\x02\u01C5\u01C7\x05*\x16\x02\u01C6\u01C4\x03\x02\x02\x02\u01C7\u01CA" + + "\x03\x02\x02\x02\u01C8\u01C6\x03\x02\x02\x02\u01C8\u01C9\x03\x02\x02\x02" + + "\u01C9\u01CC\x03\x02\x02\x02\u01CA\u01C8\x03\x02\x02\x02\u01CB\u01CD\x07" + + "\n\x02\x02\u01CC\u01CB\x03\x02\x02\x02\u01CC\u01CD\x03\x02\x02\x02\u01CD" + + "\u01CE\x03\x02\x02\x02\u01CE\u01CF\x07\x05\x02\x02\u01CF\u0248\x03\x02" + + "\x02\x02\u01D0\u01D1\x07.\x02\x02\u01D1\u01D2\x07\x04\x02\x02\u01D2\u01D7" + + "\x05*\x16\x02\u01D3\u01D4\x07\n\x02\x02\u01D4\u01D6\x05*\x16\x02\u01D5" + + "\u01D3\x03\x02\x02\x02\u01D6\u01D9\x03\x02\x02\x02\u01D7\u01D5\x03\x02" + + "\x02\x02\u01D7\u01D8\x03\x02\x02\x02\u01D8\u01DB\x03\x02\x02\x02\u01D9" + + "\u01D7\x03\x02\x02\x02\u01DA\u01DC\x07\n\x02\x02\u01DB\u01DA\x03\x02\x02" + + "\x02\u01DB\u01DC\x03\x02\x02\x02\u01DC\u01DD\x03\x02\x02\x02\u01DD\u01DE" + + "\x07\x05\x02\x02\u01DE\u0248\x03\x02\x02\x02\u01DF\u0248\x05,\x17\x02" + + "\u01E0\u01E1\x07#\x02\x02\u01E1\u01E2\x07\x04\x02\x02\u01E2\u01E7\x05" + + "*\x16\x02\u01E3\u01E4\x07\n\x02\x02\u01E4\u01E6\x05*\x16\x02\u01E5\u01E3" + + "\x03\x02\x02\x02\u01E6\u01E9\x03\x02\x02\x02\u01E7\u01E5\x03\x02\x02\x02" + + "\u01E7\u01E8\x03\x02\x02\x02\u01E8\u01EB\x03\x02\x02\x02\u01E9\u01E7\x03" + + "\x02\x02\x02\u01EA\u01EC\x07\n\x02\x02\u01EB\u01EA\x03\x02\x02\x02\u01EB" + + "\u01EC\x03\x02\x02\x02\u01EC\u01ED\x03\x02\x02\x02\u01ED\u01EE\x07\x05" + + "\x02\x02\u01EE\u0248\x03\x02\x02\x02\u01EF\u01F0\x07$\x02\x02\u01F0\u01F1" + + "\x07\x04\x02\x02\u01F1\u01F6\x05*\x16\x02\u01F2\u01F3\x07\n\x02\x02\u01F3" + + "\u01F5\x05*\x16\x02\u01F4\u01F2\x03\x02\x02\x02\u01F5\u01F8\x03\x02\x02" + + "\x02\u01F6\u01F4\x03"; private static readonly _serializedATNSegment1: string = - "A\x02\x02\u01FE\u01FF\x05*\x16\x02\u01FF\u0200\x07\n\x02\x02\u0200\u0205" + - "\x05*\x16\x02\u0201\u0202\x07\n\x02\x02\u0202\u0204\x05*\x16\x02\u0203" + - "\u0201\x03\x02\x02\x02\u0204\u0207\x03\x02\x02\x02\u0205\u0203\x03\x02" + - "\x02\x02\u0205\u0206\x03\x02\x02\x02\u0206\u0209\x03\x02\x02\x02\u0207" + - "\u0205\x03\x02\x02\x02\u0208\u020A\x07\n\x02\x02\u0209\u0208\x03\x02\x02" + - "\x02\u0209\u020A\x03\x02\x02\x02\u020A\u020B\x03\x02\x02\x02\u020B\u020C" + - "\x07B\x02\x02\u020C\u0241\x03\x02\x02\x02\u020D\u020E\x07\x04\x02\x02" + - "\u020E\u0213\x058\x1D\x02\u020F\u0210\x07\n\x02\x02\u0210\u0212\x058\x1D" + - "\x02\u0211\u020F\x03\x02\x02\x02\u0212\u0215\x03\x02\x02\x02\u0213\u0211" + - "\x03\x02\x02\x02\u0213\u0214\x03\x02\x02\x02\u0214\u0217\x03\x02\x02\x02" + - "\u0215\u0213\x03\x02\x02\x02\u0216\u0218\x07\n\x02\x02\u0217\u0216\x03" + - "\x02\x02\x02\u0217\u0218\x03\x02\x02\x02\u0218\u0219\x03\x02\x02\x02\u0219" + - "\u021A\x07\x05\x02\x02\u021A\u0241\x03\x02\x02\x02\u021B\u0224\x07\x1C" + - "\x02\x02\u021C\u0221\x05*\x16\x02\u021D\u021E\x07\n\x02\x02\u021E\u0220" + - "\x05*\x16\x02\u021F\u021D\x03\x02\x02\x02\u0220\u0223\x03\x02\x02\x02" + - "\u0221\u021F\x03\x02\x02\x02\u0221\u0222\x03\x02\x02\x02\u0222\u0225\x03" + - "\x02\x02\x02\u0223\u0221\x03\x02\x02\x02\u0224\u021C\x03\x02\x02\x02\u0224" + - "\u0225\x03\x02\x02\x02\u0225\u0227\x03\x02\x02\x02\u0226\u0228\x07\n\x02" + - "\x02\u0227\u0226\x03\x02\x02\x02\u0227\u0228\x03\x02\x02\x02\u0228\u0229" + - "\x03\x02\x02\x02\u0229\u0241\x07\x1D\x02\x02\u022A\u022B\x07%\x02\x02" + - "\u022B\u022C\x07A\x02\x02\u022C\u022D\x05*\x16\x02\u022D\u022E\x07B\x02" + - "\x02\u022E\u022F\x05*\x16\x02\u022F\u0230\x07&\x02\x02\u0230\u0231\x05" + - "*\x16\x07\u0231\u0241\x03\x02\x02\x02\u0232\u0233\x05\n\x06\x02\u0233" + - "\u0234\x05*\x16\x06\u0234\u0241\x03\x02\x02\x02\u0235\u0236\x05\x10\t" + - "\x02\u0236\u0237\x05*\x16\x05\u0237\u0241\x03\x02\x02\x02\u0238\u0239" + - "\x07A\x02\x02\u0239\u023A\x05*\x16\x02\u023A\u023B\x07B\x02\x02\u023B" + - "\u0241\x03\x02\x02\x02\u023C\u023D\x07\x04\x02\x02\u023D\u023E\x05*\x16" + - "\x02\u023E\u023F\x07\x05\x02\x02\u023F\u0241\x03\x02\x02\x02\u0240\u01AB" + - "\x03\x02\x02\x02\u0240\u01AD\x03\x02\x02\x02\u0240\u01B4\x03\x02\x02\x02" + - "\u0240\u01B6\x03\x02\x02\x02\u0240\u01BB\x03\x02\x02\x02\u0240\u01CA\x03" + - "\x02\x02\x02\u0240\u01D9\x03\x02\x02\x02\u0240\u01E8\x03\x02\x02\x02\u0240" + - "\u01FB\x03\x02\x02\x02\u0240\u01FD\x03\x02\x02\x02\u0240\u020D\x03\x02" + - "\x02\x02\u0240\u021B\x03\x02\x02\x02\u0240\u022A\x03\x02\x02\x02\u0240" + - "\u0232\x03\x02\x02\x02\u0240\u0235\x03\x02\x02\x02\u0240\u0238\x03\x02" + - "\x02\x02\u0240\u023C\x03\x02\x02\x02\u0241\u0280\x03\x02\x02\x02\u0242" + - "\u0243\f\x1C\x02\x02\u0243\u0244\x07!\x02\x02\u0244\u027F\x05*\x16\x1C" + - "\u0245\u0246\f\x1A\x02\x02\u0246\u0247\t\x02\x02\x02\u0247\u027F\x05*" + - "\x16\x1B\u0248\u0249\f\x19\x02\x02\u0249\u024A\t\x03\x02\x02\u024A\u027F" + - "\x05*\x16\x1A\u024B\u024C\f\x18\x02\x02\u024C\u024D\t\x04\x02\x02\u024D" + - "\u027F\x05*\x16\x19\u024E\u024F\f\x16\x02\x02\u024F\u0250\x07@\x02\x02" + - "\u0250\u0251\x05*\x16\x17\u0251\u0252\b\x16\x01\x02\u0252\u027F\x03\x02" + - "\x02\x02\u0253\u0254\f\x14\x02\x02\u0254\u0255\x07-\x02\x02\u0255\u027F" + - "\x05*\x16\x15\u0256\u0257\f\x12\x02\x02\u0257\u0258\x07.\x02\x02\u0258" + - "\u027F\x05*\x16\x13\u0259\u025A\f\x11\x02\x02\u025A\u025B\x07/\x02\x02" + - "\u025B\u027F\x05*\x16\x12\u025C\u025D\f\x10\x02\x02\u025D\u025E\x070\x02" + - "\x02\u025E\u027F\x05*\x16\x11\u025F\u0260\f\n\x02\x02\u0260\u0261\x07" + - "\x1A\x02\x02\u0261\u027F\x05*\x16\v\u0262\u0263\f \x02\x02\u0263\u0264" + - "\x07\x16\x02\x02\u0264\u026A\x05<\x1F\x02\u0265\u0267\x07A\x02\x02\u0266" + - "\u0268\x056\x1C\x02\u0267\u0266\x03\x02\x02\x02\u0267\u0268\x03\x02\x02" + - "\x02\u0268\u0269\x03\x02\x02\x02\u0269\u026B\x07B\x02\x02\u026A\u0265" + - "\x03\x02\x02\x02\u026A\u026B\x03\x02\x02\x02\u026B\u027F\x03\x02\x02\x02" + - "\u026C\u026D\f\x1D\x02\x02\u026D\u026E\x07\x1C\x02\x02\u026E\u026F\x05" + - "*\x16\x02\u026F\u0270\x07\x1D\x02\x02\u0270\u027F\x03\x02\x02\x02\u0271" + - "\u0272\f\x0F\x02\x02\u0272\u027A\x074\x02\x02\u0273\u0274\x07\r\x02\x02" + - "\u0274\u0275\x07*\x02\x02\u0275\u0276\x07\x07\x02\x02\u0276\u0277\x05" + - "2\x1A\x02\u0277\u0278\x07\x1B\x02\x02\u0278\u0279\x05*\x16\x02\u0279\u027B" + - "\x03\x02\x02\x02\u027A\u0273\x03\x02\x02\x02\u027B\u027C\x03\x02\x02\x02" + - "\u027C\u027A\x03\x02\x02\x02\u027C\u027D\x03\x02\x02\x02\u027D\u027F\x03" + - "\x02\x02\x02\u027E\u0242\x03\x02\x02\x02\u027E\u0245\x03\x02\x02\x02\u027E" + - "\u0248\x03\x02\x02\x02\u027E\u024B\x03\x02\x02\x02\u027E\u024E\x03\x02" + - "\x02\x02\u027E\u0253\x03\x02\x02\x02\u027E\u0256\x03\x02\x02\x02\u027E" + - "\u0259\x03\x02\x02\x02\u027E\u025C\x03\x02\x02\x02\u027E\u025F\x03\x02" + - "\x02\x02\u027E\u0262\x03\x02\x02\x02\u027E\u026C\x03\x02\x02\x02\u027E" + - "\u0271\x03\x02\x02\x02\u027F\u0282\x03\x02\x02\x02\u0280\u027E\x03\x02" + - "\x02\x02\u0280\u0281\x03\x02\x02\x02\u0281+\x03\x02\x02\x02\u0282\u0280" + - "\x03\x02\x02\x02\u0283\u0284\x05\b\x05\x02\u0284\u0285\x07\x02\x02\x03" + - "\u0285\u028D\x03\x02\x02\x02\u0286\u0287\x05*\x16\x02\u0287\u0288\x07" + - "\x02\x02\x03\u0288\u028D\x03\x02\x02\x02\u0289\u028A\x07D\x02\x02\u028A" + - "\u028D\x07\x02\x02\x03\u028B\u028D\x07\x02\x02\x03\u028C\u0283\x03\x02" + - "\x02\x02\u028C\u0286\x03\x02\x02\x02\u028C\u0289\x03\x02\x02\x02\u028C" + - "\u028B\x03\x02\x02\x02\u028D-\x03\x02\x02\x02\u028E\u028F\x052\x1A\x02" + - "\u028F\u0290\x07\x1B\x02\x02\u0290\u0291\x05*\x16\x02\u0291\u02A0\x03" + - "\x02\x02\x02\u0292\u0293\x07A\x02\x02\u0293\u0298\x052\x1A\x02\u0294\u0295" + - "\x07\n\x02\x02\u0295\u0297\x052\x1A\x02\u0296\u0294\x03\x02\x02\x02\u0297" + - "\u029A\x03\x02\x02\x02\u0298\u0296\x03\x02\x02\x02\u0298\u0299\x03\x02" + - "\x02\x02\u0299\u029B\x03\x02\x02\x02\u029A\u0298\x03\x02\x02\x02\u029B" + - "\u029C\x07B\x02\x02\u029C\u029D\x07\x1B\x02\x02\u029D\u029E\x05*\x16\x02" + - "\u029E\u02A0\x03\x02\x02\x02\u029F\u028E\x03\x02\x02\x02\u029F\u0292\x03" + - "\x02\x02\x02\u02A0/\x03\x02\x02\x02\u02A1\u02A4\x07\'\x02\x02\u02A2\u02A4" + - "\x05B\"\x02\u02A3\u02A1\x03\x02\x02\x02\u02A3\u02A2\x03\x02\x02\x02\u02A4" + - "1\x03\x02\x02\x02\u02A5\u02A6\x050\x19\x02\u02A63\x03\x02\x02\x02\u02A7" + - "\u02AA\x077\x02\x02\u02A8\u02AA\x05B\"\x02\u02A9\u02A7\x03\x02\x02\x02" + - "\u02A9\u02A8\x03\x02\x02\x02\u02AA5\x03\x02\x02\x02\u02AB\u02B0\x05*\x16" + - "\x02\u02AC\u02AD\x07\n\x02\x02\u02AD\u02AF\x05*\x16\x02\u02AE\u02AC\x03" + - "\x02\x02\x02\u02AF\u02B2\x03\x02\x02\x02\u02B0\u02AE\x03\x02\x02\x02\u02B0" + - "\u02B1\x03\x02\x02\x02\u02B17\x03\x02\x02\x02\u02B2\u02B0\x03\x02\x02" + - "\x02\u02B3\u02B4\x05D#\x02\u02B4\u02B5\x07\x07\x02\x02\u02B5\u02B6\x05" + - "*\x16\x02\u02B6\u02BA\x03\x02\x02\x02\u02B7\u02B8\x07(\x02\x02\u02B8\u02BA" + - "\x05*\x16\x02\u02B9\u02B3\x03\x02\x02\x02\u02B9\u02B7\x03\x02\x02\x02" + - "\u02BA9\x03\x02\x02\x02\u02BB\u02BE\x05B\"\x02\u02BC\u02BE\t\x05\x02\x02" + - "\u02BD\u02BB\x03\x02\x02\x02\u02BD\u02BC\x03\x02\x02\x02\u02BE;\x03\x02" + - "\x02\x02\u02BF\u02C2\x05B\"\x02\u02C0\u02C2\t\x06\x02\x02\u02C1\u02BF" + - "\x03\x02\x02\x02\u02C1\u02C0\x03\x02\x02\x02\u02C2=\x03\x02\x02\x02\u02C3" + - "\u02C4\t\x07\x02\x02\u02C4?\x03\x02\x02\x02\u02C5\u02C6\t\b\x02\x02\u02C6" + - "A\x03\x02\x02\x02\u02C7\u02CC\x07C\x02\x02\u02C8\u02C9\x07)\x02\x02\u02C9" + - "\u02CB\x07C\x02\x02\u02CA\u02C8\x03\x02\x02\x02\u02CB\u02CE\x03\x02\x02" + - "\x02\u02CC\u02CA\x03\x02\x02\x02\u02CC\u02CD\x03\x02\x02\x02\u02CDC\x03" + - "\x02\x02\x02\u02CE\u02CC\x03\x02\x02\x02\u02CF\u02D4\x07C\x02\x02\u02D0" + - "\u02D1\x05B\"\x02\u02D1\u02D2\b#\x01\x02\u02D2\u02D4\x03\x02\x02\x02\u02D3" + - "\u02CF\x03\x02\x02\x02\u02D3\u02D0\x03\x02\x02\x02\u02D4E\x03\x02\x02" + - "\x02QIPYaz\x84\x87\x8C\x9B\xA2\xA6\xA9\xB6\xBD\xC0\xC7\xCD\xD2\xDD\xE5" + - "\xEB\xEF\xF1\xFC\xFE\u010D\u0115\u0124\u012C\u012E\u013F\u0142\u0145\u015C" + - "\u0160\u016B\u0175\u017D\u017F\u0189\u018C\u0197\u01A1\u01A3\u01A7\u01B0" + - "\u01C2\u01C6\u01D1\u01D5\u01E0\u01E4\u01EF\u01F3\u01FB\u0205\u0209\u0213" + - "\u0217\u0221\u0224\u0227\u0240\u0267\u026A\u027C\u027E\u0280\u028C\u0298" + - "\u029F\u02A3\u02A9\u02B0\u02B9\u02BD\u02C1\u02CC\u02D3"; + "\x02\x02\x02\u01F6\u01F7\x03\x02\x02\x02\u01F7\u01FA\x03\x02\x02\x02\u01F8" + + "\u01F6\x03\x02\x02\x02\u01F9\u01FB\x07\n\x02\x02\u01FA\u01F9\x03\x02\x02" + + "\x02\u01FA\u01FB\x03\x02\x02\x02\u01FB\u01FC\x03\x02\x02\x02\u01FC\u01FD" + + "\x07\x05\x02\x02\u01FD\u0248\x03\x02\x02\x02\u01FE\u0203\x05H%\x02\u01FF" + + "\u0203\x07,\x02\x02\u0200\u0203\x07+\x02\x02\u0201\u0203\x07*\x02\x02" + + "\u0202\u01FE\x03\x02\x02\x02\u0202\u01FF\x03\x02\x02\x02\u0202\u0200\x03" + + "\x02\x02\x02\u0202\u0201\x03\x02\x02\x02\u0203\u0248\x03\x02\x02\x02\u0204" + + "\u0205\x07A\x02\x02\u0205\u0206\x05*\x16\x02\u0206\u0207\x07\n\x02\x02" + + "\u0207\u020C\x05*\x16\x02\u0208\u0209\x07\n\x02\x02\u0209\u020B\x05*\x16" + + "\x02\u020A\u0208\x03\x02\x02\x02\u020B\u020E\x03\x02\x02\x02\u020C\u020A" + + "\x03\x02\x02\x02\u020C\u020D\x03\x02\x02\x02\u020D\u0210\x03\x02\x02\x02" + + "\u020E\u020C\x03\x02\x02\x02\u020F\u0211\x07\n\x02\x02\u0210\u020F\x03" + + "\x02\x02\x02\u0210\u0211\x03\x02\x02\x02\u0211\u0212\x03\x02\x02\x02\u0212" + + "\u0213\x07B\x02\x02\u0213\u0248\x03\x02\x02\x02\u0214\u0215\x07\x04\x02" + + "\x02\u0215\u021A\x05> \x02\u0216\u0217\x07\n\x02\x02\u0217\u0219\x05>" + + " \x02\u0218\u0216\x03\x02\x02\x02\u0219\u021C\x03\x02\x02\x02\u021A\u0218" + + "\x03\x02\x02\x02\u021A\u021B\x03\x02\x02\x02\u021B\u021E\x03\x02\x02\x02" + + "\u021C\u021A\x03\x02\x02\x02\u021D\u021F\x07\n\x02\x02\u021E\u021D\x03" + + "\x02\x02\x02\u021E\u021F\x03\x02\x02\x02\u021F\u0220\x03\x02\x02\x02\u0220" + + "\u0221\x07\x05\x02\x02\u0221\u0248\x03\x02\x02\x02\u0222\u022B\x07\x1C" + + "\x02\x02\u0223\u0228\x05*\x16\x02\u0224\u0225\x07\n\x02\x02\u0225\u0227" + + "\x05*\x16\x02\u0226\u0224\x03\x02\x02\x02\u0227\u022A\x03\x02\x02\x02" + + "\u0228\u0226\x03\x02\x02\x02\u0228\u0229\x03\x02\x02\x02\u0229\u022C\x03" + + "\x02\x02\x02\u022A\u0228\x03\x02\x02\x02\u022B\u0223\x03\x02\x02\x02\u022B" + + "\u022C\x03\x02\x02\x02\u022C\u022E\x03\x02\x02\x02\u022D\u022F\x07\n\x02" + + "\x02\u022E\u022D\x03\x02\x02\x02\u022E\u022F\x03\x02\x02\x02\u022F\u0230" + + "\x03\x02\x02\x02\u0230\u0248\x07\x1D\x02\x02\u0231\u0232\x07%\x02\x02" + + "\u0232\u0233\x07A\x02\x02\u0233\u0234\x05*\x16\x02\u0234\u0235\x07B\x02" + + "\x02\u0235\u0236\x05*\x16\x02\u0236\u0237\x07&\x02\x02\u0237\u0238\x05" + + "*\x16\x07\u0238\u0248\x03\x02\x02\x02\u0239\u023A\x05\n\x06\x02\u023A" + + "\u023B\x05*\x16\x06\u023B\u0248\x03\x02\x02\x02\u023C\u023D\x05\x10\t" + + "\x02\u023D\u023E\x05*\x16\x05\u023E\u0248\x03\x02\x02\x02\u023F\u0240" + + "\x07A\x02\x02\u0240\u0241\x05*\x16\x02\u0241\u0242\x07B\x02\x02\u0242" + + "\u0248\x03\x02\x02\x02\u0243\u0244\x07\x04\x02\x02\u0244\u0245\x05*\x16" + + "\x02\u0245\u0246\x07\x05\x02\x02\u0246\u0248\x03\x02\x02\x02\u0247\u01B1" + + "\x03\x02\x02\x02\u0247\u01B3\x03\x02\x02\x02\u0247\u01BA\x03\x02\x02\x02" + + "\u0247\u01BC\x03\x02\x02\x02\u0247\u01C1\x03\x02\x02\x02\u0247\u01D0\x03" + + "\x02\x02\x02\u0247\u01DF\x03\x02\x02\x02\u0247\u01E0\x03\x02\x02\x02\u0247" + + "\u01EF\x03\x02\x02\x02\u0247\u0202\x03\x02\x02\x02\u0247\u0204\x03\x02" + + "\x02\x02\u0247\u0214\x03\x02\x02\x02\u0247\u0222\x03\x02\x02\x02\u0247" + + "\u0231\x03\x02\x02\x02\u0247\u0239\x03\x02\x02\x02\u0247\u023C\x03\x02" + + "\x02\x02\u0247\u023F\x03\x02\x02\x02\u0247\u0243\x03\x02\x02\x02\u0248" + + "\u0287\x03\x02\x02\x02\u0249\u024A\f\x1D\x02\x02\u024A\u024B\x07!\x02" + + "\x02\u024B\u0286\x05*\x16\x1D\u024C\u024D\f\x1B\x02\x02\u024D\u024E\t" + + "\x02\x02\x02\u024E\u0286\x05*\x16\x1C\u024F\u0250\f\x1A\x02\x02\u0250" + + "\u0251\t\x03\x02\x02\u0251\u0286\x05*\x16\x1B\u0252\u0253\f\x19\x02\x02" + + "\u0253\u0254\t\x04\x02\x02\u0254\u0286\x05*\x16\x1A\u0255\u0256\f\x17" + + "\x02\x02\u0256\u0257\x07@\x02\x02\u0257\u0258\x05*\x16\x18\u0258\u0259" + + "\b\x16\x01\x02\u0259\u0286\x03\x02\x02\x02\u025A\u025B\f\x15\x02\x02\u025B" + + "\u025C\x07-\x02\x02\u025C\u0286\x05*\x16\x16\u025D\u025E\f\x13\x02\x02" + + "\u025E\u025F\x07.\x02\x02\u025F\u0286\x05*\x16\x14\u0260\u0261\f\x12\x02" + + "\x02\u0261\u0262\x07/\x02\x02\u0262\u0286\x05*\x16\x13\u0263\u0264\f\x11" + + "\x02\x02\u0264\u0265\x070\x02\x02\u0265\u0286\x05*\x16\x12\u0266\u0267" + + "\f\n\x02\x02\u0267\u0268\x07\x1A\x02\x02\u0268\u0286\x05*\x16\v\u0269" + + "\u026A\f!\x02\x02\u026A\u026B\x07\x16\x02\x02\u026B\u0271\x05B\"\x02\u026C" + + "\u026E\x07A\x02\x02\u026D\u026F\x05<\x1F\x02\u026E\u026D\x03\x02\x02\x02" + + "\u026E\u026F\x03\x02\x02\x02\u026F\u0270\x03\x02\x02\x02\u0270\u0272\x07" + + "B\x02\x02\u0271\u026C\x03\x02\x02\x02\u0271\u0272\x03\x02\x02\x02\u0272" + + "\u0286\x03\x02\x02\x02\u0273\u0274\f\x1E\x02\x02\u0274\u0275\x07\x1C\x02" + + "\x02\u0275\u0276\x05*\x16\x02\u0276\u0277\x07\x1D\x02\x02\u0277\u0286" + + "\x03\x02\x02\x02\u0278\u0279\f\x0F\x02\x02\u0279\u0281\x074\x02\x02\u027A" + + "\u027B\x07\r\x02\x02\u027B\u027C\x07*\x02\x02\u027C\u027D\x07\x07\x02" + + "\x02\u027D\u027E\x058\x1D\x02\u027E\u027F\x07\x1B\x02\x02\u027F\u0280" + + "\x05*\x16\x02\u0280\u0282\x03\x02\x02\x02\u0281\u027A\x03\x02\x02\x02" + + "\u0282\u0283\x03\x02\x02\x02\u0283\u0281\x03\x02\x02\x02\u0283\u0284\x03" + + "\x02\x02\x02\u0284\u0286\x03\x02\x02\x02\u0285\u0249\x03\x02\x02\x02\u0285" + + "\u024C\x03\x02\x02\x02\u0285\u024F\x03\x02\x02\x02\u0285\u0252\x03\x02" + + "\x02\x02\u0285\u0255\x03\x02\x02\x02\u0285\u025A\x03\x02\x02\x02\u0285" + + "\u025D\x03\x02\x02\x02\u0285\u0260\x03\x02\x02\x02\u0285\u0263\x03\x02" + + "\x02\x02\u0285\u0266\x03\x02\x02\x02\u0285\u0269\x03\x02\x02\x02\u0285" + + "\u0273\x03\x02\x02\x02\u0285\u0278\x03\x02\x02\x02\u0286\u0289\x03\x02" + + "\x02\x02\u0287\u0285\x03\x02\x02\x02\u0287\u0288\x03\x02\x02\x02\u0288" + + "+\x03\x02\x02\x02\u0289\u0287\x03\x02\x02\x02\u028A\u028B\x074\x02\x02" + + "\u028B\u028C\x05*\x16\x02\u028C\u028E\x07\x04\x02\x02\u028D\u028F\x07" + + "\r\x02\x02\u028E\u028D\x03\x02\x02\x02\u028E\u028F\x03\x02\x02\x02\u028F" + + "\u0290\x03\x02\x02\x02\u0290\u0295\x05.\x18\x02\u0291\u0292\x07\r\x02" + + "\x02\u0292\u0294\x05.\x18\x02\u0293\u0291\x03\x02\x02\x02\u0294\u0297" + + "\x03\x02\x02\x02\u0295\u0293\x03\x02\x02\x02\u0295\u0296\x03\x02\x02\x02" + + "\u0296\u0298\x03\x02\x02\x02\u0297\u0295\x03\x02\x02\x02\u0298\u0299\x07" + + "\x05\x02\x02\u0299-\x03\x02\x02\x02\u029A\u029D\x050\x19\x02\u029B\u029D" + + "\x07\'\x02\x02\u029C\u029A\x03\x02\x02\x02\u029C\u029B\x03\x02\x02\x02" + + "\u029D\u029E\x03\x02\x02\x02\u029E\u029F\x07\x1B\x02\x02\u029F\u02A0\x05" + + "*\x16\x02\u02A0/\x03\x02\x02\x02\u02A1\u02A8\x05J&\x02\u02A2\u02A5\x07" + + "A\x02\x02\u02A3\u02A6\x05J&\x02\u02A4\u02A6\x07\'\x02\x02\u02A5\u02A3" + + "\x03\x02\x02\x02\u02A5\u02A4\x03\x02\x02\x02\u02A6\u02A7\x03\x02\x02\x02" + + "\u02A7\u02A9\x07B\x02\x02\u02A8\u02A2\x03\x02\x02\x02\u02A8\u02A9\x03" + + "\x02\x02\x02\u02A91\x03\x02\x02\x02\u02AA\u02AB\x05\b\x05\x02\u02AB\u02AC" + + "\x07\x02\x02\x03\u02AC\u02B4\x03\x02\x02\x02\u02AD\u02AE\x05*\x16\x02" + + "\u02AE\u02AF\x07\x02\x02\x03\u02AF\u02B4\x03\x02\x02\x02\u02B0\u02B1\x07" + + "D\x02\x02\u02B1\u02B4\x07\x02\x02\x03\u02B2\u02B4\x07\x02\x02\x03\u02B3" + + "\u02AA\x03\x02\x02\x02\u02B3\u02AD\x03\x02\x02\x02\u02B3\u02B0\x03\x02" + + "\x02\x02\u02B3\u02B2\x03\x02\x02\x02\u02B43\x03\x02\x02\x02\u02B5\u02B6" + + "\x058\x1D\x02\u02B6\u02B7\x07\x1B\x02\x02\u02B7\u02B8\x05*\x16\x02\u02B8" + + "\u02C7\x03\x02\x02\x02\u02B9\u02BA\x07A\x02\x02\u02BA\u02BF\x058\x1D\x02" + + "\u02BB\u02BC\x07\n\x02\x02\u02BC\u02BE\x058\x1D\x02\u02BD\u02BB\x03\x02" + + "\x02\x02\u02BE\u02C1\x03\x02\x02\x02\u02BF\u02BD\x03\x02\x02\x02\u02BF" + + "\u02C0\x03\x02\x02\x02\u02C0\u02C2\x03\x02\x02\x02\u02C1\u02BF\x03\x02" + + "\x02\x02\u02C2\u02C3\x07B\x02\x02\u02C3\u02C4\x07\x1B\x02\x02\u02C4\u02C5" + + "\x05*\x16\x02\u02C5\u02C7\x03\x02\x02\x02\u02C6\u02B5\x03\x02\x02\x02" + + "\u02C6\u02B9\x03\x02\x02\x02\u02C75\x03\x02\x02\x02\u02C8\u02CB\x07\'" + + "\x02\x02\u02C9\u02CB\x05H%\x02\u02CA\u02C8\x03\x02\x02\x02\u02CA\u02C9" + + "\x03\x02\x02\x02\u02CB7\x03\x02\x02\x02\u02CC\u02CD\x056\x1C\x02\u02CD" + + "9\x03\x02\x02\x02\u02CE\u02D1\x077\x02\x02\u02CF\u02D1\x05H%\x02\u02D0" + + "\u02CE\x03\x02\x02\x02\u02D0\u02CF\x03\x02\x02\x02\u02D1;\x03\x02\x02" + + "\x02\u02D2\u02D7\x05*\x16\x02\u02D3\u02D4\x07\n\x02\x02\u02D4\u02D6\x05" + + "*\x16\x02\u02D5\u02D3\x03\x02\x02\x02\u02D6\u02D9\x03\x02\x02\x02\u02D7" + + "\u02D5\x03\x02\x02\x02\u02D7\u02D8\x03\x02\x02\x02\u02D8=\x03\x02\x02" + + "\x02\u02D9\u02D7\x03\x02\x02\x02\u02DA\u02DB\x05J&\x02\u02DB\u02DC\x07" + + "\x07\x02\x02\u02DC\u02DD\x05*\x16\x02\u02DD\u02E1\x03\x02\x02\x02\u02DE" + + "\u02DF\x07(\x02\x02\u02DF\u02E1\x05*\x16\x02\u02E0\u02DA\x03\x02\x02\x02" + + "\u02E0\u02DE\x03\x02\x02\x02\u02E1?\x03\x02\x02\x02\u02E2\u02E5\x05H%" + + "\x02\u02E3\u02E5\t\x05\x02\x02\u02E4\u02E2\x03\x02\x02\x02\u02E4\u02E3" + + "\x03\x02\x02\x02\u02E5A\x03\x02\x02\x02\u02E6\u02E9\x05H%\x02\u02E7\u02E9" + + "\t\x06\x02\x02\u02E8\u02E6\x03\x02\x02\x02\u02E8\u02E7\x03\x02\x02\x02" + + "\u02E9C\x03\x02\x02\x02\u02EA\u02EB\t\x07\x02\x02\u02EBE\x03\x02\x02\x02" + + "\u02EC\u02ED\t\b\x02\x02\u02EDG\x03\x02\x02\x02\u02EE\u02F3\x07C\x02\x02" + + "\u02EF\u02F0\x07)\x02\x02\u02F0\u02F2\x07C\x02\x02\u02F1\u02EF\x03\x02" + + "\x02\x02\u02F2\u02F5\x03\x02\x02\x02\u02F3\u02F1\x03\x02\x02\x02\u02F3" + + "\u02F4\x03\x02\x02\x02\u02F4I\x03\x02\x02\x02\u02F5\u02F3\x03\x02\x02" + + "\x02\u02F6\u02FB\x07C\x02\x02\u02F7\u02F8\x05H%\x02\u02F8\u02F9\b&\x01" + + "\x02\u02F9\u02FB\x03\x02\x02\x02\u02FA\u02F6\x03\x02\x02\x02\u02FA\u02F7" + + "\x03\x02\x02\x02\u02FBK\x03\x02\x02\x02VOV_g\x80\x8A\x8D\x92\xA1\xA8\xAC" + + "\xAF\xBC\xC3\xC6\xCD\xD3\xD8\xE3\xEB\xF1\xF5\xF7\u0102\u0104\u0113\u011B" + + "\u012A\u0132\u0134\u0145\u0148\u014B\u0162\u0166\u0171\u017B\u0183\u0185" + + "\u018F\u0192\u019D\u01A7\u01A9\u01AD\u01B6\u01C8\u01CC\u01D7\u01DB\u01E7" + + "\u01EB\u01F6\u01FA\u0202\u020C\u0210\u021A\u021E\u0228\u022B\u022E\u0247" + + "\u026E\u0271\u0283\u0285\u0287\u028E\u0295\u029C\u02A5\u02A8\u02B3\u02BF" + + "\u02C6\u02CA\u02D0\u02D7\u02E0\u02E4\u02E8\u02F3\u02FA"; public static readonly _serializedATN: string = Utils.join( [ QuintParser._serializedATNSegment0, @@ -5713,6 +5914,35 @@ export class ImpliesContext extends ExprContext { } } } +export class MatchSumContext extends ExprContext { + public matchSumExpr(): MatchSumExprContext { + return this.getRuleContext(0, MatchSumExprContext); + } + constructor(ctx: ExprContext) { + super(ctx.parent, ctx.invokingState); + this.copyFrom(ctx); + } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterMatchSum) { + listener.enterMatchSum(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitMatchSum) { + listener.exitMatchSum(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitMatchSum) { + return visitor.visitMatchSum(this); + } else { + return visitor.visitChildren(this); + } + } +} export class MatchContext extends ExprContext { public expr(): ExprContext[]; public expr(i: number): ExprContext; @@ -6174,6 +6404,129 @@ export class BracesContext extends ExprContext { } +export class MatchSumExprContext extends ParserRuleContext { + public _matchSumCase!: MatchSumCaseContext; + public _matchCase: MatchSumCaseContext[] = []; + public MATCH(): TerminalNode { return this.getToken(QuintParser.MATCH, 0); } + public expr(): ExprContext { + return this.getRuleContext(0, ExprContext); + } + public matchSumCase(): MatchSumCaseContext[]; + public matchSumCase(i: number): MatchSumCaseContext; + public matchSumCase(i?: number): MatchSumCaseContext | MatchSumCaseContext[] { + if (i === undefined) { + return this.getRuleContexts(MatchSumCaseContext); + } else { + return this.getRuleContext(i, MatchSumCaseContext); + } + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_matchSumExpr; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterMatchSumExpr) { + listener.enterMatchSumExpr(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitMatchSumExpr) { + listener.exitMatchSumExpr(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitMatchSumExpr) { + return visitor.visitMatchSumExpr(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class MatchSumCaseContext extends ParserRuleContext { + public _variantMatch!: MatchSumVariantContext; + public _wildCardMatch!: Token; + public expr(): ExprContext { + return this.getRuleContext(0, ExprContext); + } + public matchSumVariant(): MatchSumVariantContext | undefined { + return this.tryGetRuleContext(0, MatchSumVariantContext); + } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_matchSumCase; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterMatchSumCase) { + listener.enterMatchSumCase(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitMatchSumCase) { + listener.exitMatchSumCase(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitMatchSumCase) { + return visitor.visitMatchSumCase(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class MatchSumVariantContext extends ParserRuleContext { + public _variantLabel!: SimpleIdContext; + public _variantParam!: SimpleIdContext; + public simpleId(): SimpleIdContext[]; + public simpleId(i: number): SimpleIdContext; + public simpleId(i?: number): SimpleIdContext | SimpleIdContext[] { + if (i === undefined) { + return this.getRuleContexts(SimpleIdContext); + } else { + return this.getRuleContext(i, SimpleIdContext); + } + } + public LPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.LPAREN, 0); } + public RPAREN(): TerminalNode | undefined { return this.tryGetToken(QuintParser.RPAREN, 0); } + constructor(parent: ParserRuleContext | undefined, invokingState: number) { + super(parent, invokingState); + } + // @Override + public get ruleIndex(): number { return QuintParser.RULE_matchSumVariant; } + // @Override + public enterRule(listener: QuintListener): void { + if (listener.enterMatchSumVariant) { + listener.enterMatchSumVariant(this); + } + } + // @Override + public exitRule(listener: QuintListener): void { + if (listener.exitMatchSumVariant) { + listener.exitMatchSumVariant(this); + } + } + // @Override + public accept(visitor: QuintVisitor): Result { + if (visitor.visitMatchSumVariant) { + return visitor.visitMatchSumVariant(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class UnitOrExprContext extends ParserRuleContext { public unit(): UnitContext | undefined { return this.tryGetRuleContext(0, UnitContext); diff --git a/quint/src/generated/QuintVisitor.ts b/quint/src/generated/QuintVisitor.ts index 062d7b797..f8942c9e8 100644 --- a/quint/src/generated/QuintVisitor.ts +++ b/quint/src/generated/QuintVisitor.ts @@ -41,6 +41,7 @@ import { OrExprContext } from "./QuintParser"; import { OrContext } from "./QuintParser"; import { IffContext } from "./QuintParser"; import { ImpliesContext } from "./QuintParser"; +import { MatchSumContext } from "./QuintParser"; import { MatchContext } from "./QuintParser"; import { ActionAllContext } from "./QuintParser"; import { ActionAnyContext } from "./QuintParser"; @@ -83,6 +84,9 @@ import { TypeUnionRecOneContext } from "./QuintParser"; import { RowContext } from "./QuintParser"; import { RowLabelContext } from "./QuintParser"; import { ExprContext } from "./QuintParser"; +import { MatchSumExprContext } from "./QuintParser"; +import { MatchSumCaseContext } from "./QuintParser"; +import { MatchSumVariantContext } from "./QuintParser"; import { UnitOrExprContext } from "./QuintParser"; import { LambdaContext } from "./QuintParser"; import { IdentOrHoleContext } from "./QuintParser"; @@ -362,6 +366,14 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitImplies?: (ctx: ImpliesContext) => Result; + /** + * Visit a parse tree produced by the `matchSum` + * labeled alternative in `QuintParser.expr`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMatchSum?: (ctx: MatchSumContext) => Result; + /** * Visit a parse tree produced by the `match` * labeled alternative in `QuintParser.expr`. @@ -677,6 +689,27 @@ export interface QuintVisitor extends ParseTreeVisitor { */ visitExpr?: (ctx: ExprContext) => Result; + /** + * Visit a parse tree produced by `QuintParser.matchSumExpr`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMatchSumExpr?: (ctx: MatchSumExprContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.matchSumCase`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMatchSumCase?: (ctx: MatchSumCaseContext) => Result; + + /** + * Visit a parse tree produced by `QuintParser.matchSumVariant`. + * @param ctx the parse tree + * @return the visitor result + */ + visitMatchSumVariant?: (ctx: MatchSumVariantContext) => Result; + /** * Visit a parse tree produced by `QuintParser.unitOrExpr`. * @param ctx the parse tree diff --git a/quint/testFixture/_1025importeeWithError.json b/quint/testFixture/_1025importeeWithError.json index 1b8d2045f..4027490ae 100644 --- a/quint/testFixture/_1025importeeWithError.json +++ b/quint/testFixture/_1025importeeWithError.json @@ -1 +1 @@ -{"stage":"parsing","warnings":[],"errors":[{"explanation":"mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', '-', '(', IDENTIFIER}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file +{"stage":"parsing","warnings":[],"errors":[{"explanation":"mismatched input '}' expecting {'{', 'nondet', 'val', 'def', 'pure', 'action', 'run', 'temporal', '[', 'all', 'any', 'if', '_', STRING, BOOL, INT, 'and', 'or', 'iff', 'implies', 'Set', 'List', 'Map', 'match', '-', '(', IDENTIFIER}","locs":[{"source":"mocked_path/testFixture/_1025importeeWithError.qnt","start":{"line":3,"col":0,"index":45},"end":{"line":3,"col":0,"index":45}}]}]} \ No newline at end of file From 02bbc3a7853e1d657e233df9f5a6415edc9fced1 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 22:21:57 -0400 Subject: [PATCH 04/17] Use fixture based tests This tests a bunch of behavior the naive approach was missing, and scales much better for more than a single definition. --- .../test/parsing/quintParserFrontend.test.ts | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 965db20ae..3f4f4b987 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -132,43 +132,6 @@ describe('parsing', () => { it('parses sum types', () => { parseAndCompare('_1043sumTypeDecl') - // const sumTypeIrIsFormedCorrectly: (mod: string) => void = mod => { - // const result = parsePhase1fromText(newIdGenerator(), mod, 'test') - // assert(result.isRight()) - // const [typeDef, constructorA, constructorB] = result.value.modules[0].defs - - // // Check the type - // assert(typeDef.kind === 'typedef') - // const sumType = typeDef.type! - // assert(sumType.kind === 'sum') - - // const [variantA, variantB] = sumType.fields.fields - // assert(variantA.fieldName === 'A') - // assert(isUnitType(variantA.fieldType)) - // assert(variantB.fieldName === 'B') - // assert(variantB.fieldType.kind === 'int') - - // // Check the generated constructors - // assert(constructorA.kind === 'def') - // assert(constructorA.name === 'A') - // assert(constructorA.qualifier === 'val') - // const lamA = constructorA.expr - // assert(lamA.kind === 'lambda') - // assert.deepEqual(lamA.params, []) - // assert(lamA.expr === undefined) - // } - // sumTypeIrIsFormedCorrectly(` - // module SumTypes { - // type T = - // | A - // | B(int) - // } - // `) - // sumTypeIrIsFormedCorrectly(` - // module SumTypes { - // type T = A | B(int) - // } - // `) }) it('parses match expressions', () => { From b57f0e528dd581a04cf7d6140307195efbe5430e Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 22:43:52 -0400 Subject: [PATCH 05/17] Clean up test Fixing a commented out test condition and improving naming --- quint/test/IRVisitor.test.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/quint/test/IRVisitor.test.ts b/quint/test/IRVisitor.test.ts index 6ef9be8e4..575a397a9 100644 --- a/quint/test/IRVisitor.test.ts +++ b/quint/test/IRVisitor.test.ts @@ -134,18 +134,16 @@ describe('walkModule', () => { } } - const enteredTypes = [ + const expectedTypes = [ 'int', // var a: int 'int', // const B: int 'int', // type MY_TYPE = int ] - const exitedTypes = enteredTypes - const visitor = new TestVisitor() walkModule(visitor, quintModule) - // assert.deepEqual(visitor.entered.map(typeToString), enteredTypes) - assert.deepEqual(visitor.exited.map(typeToString), exitedTypes) + assert.deepEqual(expectedTypes, visitor.entered.map(typeToString)) + assert.deepEqual(expectedTypes, visitor.exited.map(typeToString)) }) describe('visiting specific definitions', () => { From 76bbd4c66e47ce17298a48efbb2188a4723a2522 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 22:44:25 -0400 Subject: [PATCH 06/17] Ensure we compile before generating fixtures This killed some time for me cause I couldn't figure out where the fixtures where going wrong! Turned out, I just need to rebuild :D --- quint/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/package.json b/quint/package.json index 1b0877803..0a2d6edde 100644 --- a/quint/package.json +++ b/quint/package.json @@ -77,7 +77,7 @@ "generate": "npm run antlr && npm run compile && npm link && npm run api-docs && npm run update-fixtures", "antlr": "antlr4ts -visitor ./src/generated/Quint.g4 && antlr4ts -visitor ./src/generated/Effect.g4", "api-docs": "quint docs ./src/builtin.qnt > ../doc/builtin.md", - "update-fixtures": "./scripts/update-fixtures.sh", + "update-fixtures": "npm run compile && ./scripts/update-fixtures.sh", "format-check": "npx prettier --check '**/*.ts' && npx eslint '**/*.ts'", "format": "npx prettier --write '**/*.ts' && npx eslint --fix '**/*.ts'", "debug": "npx ts-node ./src/cli.ts" From 37cd8f7cc081ba1733879819cac95acb0c844a56 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 22:55:04 -0400 Subject: [PATCH 07/17] Add missing test fixtures --- quint/testFixture/_1043sumTypeDecl.json | 1 + quint/testFixture/_1043sumTypeDecl.map.json | 1 + quint/testFixture/_1043sumTypeDecl.qnt | 7 +++++++ 3 files changed, 9 insertions(+) create mode 100644 quint/testFixture/_1043sumTypeDecl.json create mode 100644 quint/testFixture/_1043sumTypeDecl.map.json create mode 100644 quint/testFixture/_1043sumTypeDecl.qnt diff --git a/quint/testFixture/_1043sumTypeDecl.json b/quint/testFixture/_1043sumTypeDecl.json new file mode 100644 index 000000000..3162b1301 --- /dev/null +++ b/quint/testFixture/_1043sumTypeDecl.json @@ -0,0 +1 @@ +{"stage":"parsing","warnings":[],"modules":[{"id":18,"name":"SumTypes","defs":[{"id":3,"name":"T","kind":"typedef","type":{"id":3,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}}],"other":{"kind":"empty"}}}},{"id":7,"kind":"def","name":"A","qualifier":"val","expr":{"id":6,"kind":"lambda","params":[],"qualifier":"val","expr":{"id":5,"kind":"variant","label":"A","expr":{"id":4,"kind":"app","opcode":"Rec","args":[]}}}},{"id":12,"kind":"def","name":"B","qualifier":"def","expr":{"id":11,"kind":"lambda","params":[{"id":8,"name":"__BParam"}],"qualifier":"def","expr":{"id":10,"kind":"variant","label":"B","expr":{"kind":"name","name":"__BParam","id":9}}}},{"id":17,"kind":"def","name":"canConstructVariants","qualifier":"val","expr":{"id":16,"kind":"app","opcode":"List","args":[{"id":13,"kind":"name","name":"A"},{"id":15,"kind":"app","opcode":"B","args":[{"id":14,"kind":"int","value":2}]}]}}]}],"table":{"9":{"kind":"param","reference":8},"13":{"kind":"def","reference":7},"15":{"kind":"def","reference":12}}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.map.json b/quint/testFixture/_1043sumTypeDecl.map.json new file mode 100644 index 000000000..1e3fe9fe6 --- /dev/null +++ b/quint/testFixture/_1043sumTypeDecl.map.json @@ -0,0 +1 @@ +{"sourceIndex":{"0":"mocked_path/testFixture/_1043sumTypeDecl.qnt"},"map":{"1":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"2":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"3":[0,{"line":1,"col":2,"index":20},{"line":3,"col":30,"index":48}],"4":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"5":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"6":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"7":[0,{"line":2,"col":6,"index":35},{"line":2,"col":6,"index":35}],"8":[0,{"line":3,"col":8,"index":45},{"line":3,"col":10,"index":47}],"9":[0,{"line":3,"col":6,"index":43},{"line":3,"col":6,"index":43}],"10":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"11":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"12":[0,{"line":3,"col":6,"index":43},{"line":3,"col":11,"index":48}],"13":[0,{"line":5,"col":34,"index":85},{"line":5,"col":34,"index":85}],"14":[0,{"line":5,"col":39,"index":90},{"line":5,"col":39,"index":90}],"15":[0,{"line":5,"col":37,"index":88},{"line":5,"col":40,"index":91}],"16":[0,{"line":5,"col":29,"index":80},{"line":5,"col":41,"index":92}],"17":[0,{"line":5,"col":2,"index":53},{"line":5,"col":41,"index":92}],"18":[0,{"line":0,"col":0,"index":0},{"line":6,"col":94,"index":94}]}} \ No newline at end of file diff --git a/quint/testFixture/_1043sumTypeDecl.qnt b/quint/testFixture/_1043sumTypeDecl.qnt new file mode 100644 index 000000000..42d9dc09d --- /dev/null +++ b/quint/testFixture/_1043sumTypeDecl.qnt @@ -0,0 +1,7 @@ +module SumTypes { + type T = + | A + | B(int) + + val canConstructVariants = List(A, B(2)) +} From fb46c9e948298e40cd9e2546fe4e504306581899 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 23:08:58 -0400 Subject: [PATCH 08/17] Add test for match parsing --- quint/src/IRVisitor.ts | 4 +++ .../test/parsing/quintParserFrontend.test.ts | 34 +------------------ 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/quint/src/IRVisitor.ts b/quint/src/IRVisitor.ts index 65015d547..edf989d9b 100644 --- a/quint/src/IRVisitor.ts +++ b/quint/src/IRVisitor.ts @@ -414,6 +414,10 @@ function walkExpression(visitor: IRVisitor, expr: ir.QuintEx): void { break case 'match': visitor.enterMatch?.(expr) + + walkExpression(visitor, expr.expr) + expr.cases.forEach(({ elim }) => walkExpression(visitor, elim)) + visitor.exitMatch?.(expr) break case 'variant': diff --git a/quint/test/parsing/quintParserFrontend.test.ts b/quint/test/parsing/quintParserFrontend.test.ts index 3f4f4b987..4cddc14cb 100644 --- a/quint/test/parsing/quintParserFrontend.test.ts +++ b/quint/test/parsing/quintParserFrontend.test.ts @@ -15,7 +15,6 @@ import { right } from '@sweet-monads/either' import { newIdGenerator } from '../../src/idGenerator' import { collectIds } from '../util' import { fileSourceResolver } from '../../src/parsing/sourceResolver' -import { errorTreeToString, isUnitType, moduleToString } from '../../src' // read a Quint file from the test data directory function readQuint(name: string): string { @@ -135,38 +134,7 @@ describe('parsing', () => { }) it('parses match expressions', () => { - const parseToString: (mod: string) => string = mod => { - const result = parsePhase1fromText(newIdGenerator(), mod, 'test') - assert(result.isRight(), result.isLeft() ? result.value.map(err => err.explanation).join('\n') : 'impossible') - return moduleToString(result.value.modules[0]) - } - const multiLine = parseToString(` - module SumTypes { - val ex = match foo { - | A => 0 - | B(n) => n - | _ => -1 - } - } - `) - assert.deepEqual( - multiLine, - `module SumTypes { - val ex = match foo { A(_) => 0 | B(n) => n | _ => iuminus(1) } -}` - ) - - const singleLine = parseToString(` - module SumTypes { - val ex = match foo { A => 0 | B(n) => n | _ => -1 } - } - `) - assert.deepEqual( - singleLine, - `module SumTypes { - val ex = match foo { A(_) => 0 | B(n) => n | _ => iuminus(1) } -}` - ) + parseAndCompare('_1044matchExpression') }) }) From 928dd5be13052fafb4d45010dbe4b47754756add Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 23:25:08 -0400 Subject: [PATCH 09/17] Add missing pretty pring tests --- quint/test/IRprinting.test.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/quint/test/IRprinting.test.ts b/quint/test/IRprinting.test.ts index c23375c7e..429f8e4cc 100644 --- a/quint/test/IRprinting.test.ts +++ b/quint/test/IRprinting.test.ts @@ -3,7 +3,7 @@ import { assert } from 'chai' import { buildDef, buildExpression, buildModuleWithDefs, buildType } from './builders/ir' import { definitionToString, expressionToString, moduleToString, typeToString } from '../src/IRprinting' import { toScheme } from '../src/types/base' -import { QuintSumType, unitType } from '../src' +import { QuintInt, QuintSumType, QuintVariant, unitType } from '../src' describe('moduleToString', () => { const quintModule = buildModuleWithDefs(['var S: Set[int]', 'val f = S.filter(x => x + 1)']) @@ -175,6 +175,20 @@ describe('expressionToString', () => { const expectedExpr = 'val x = 1 { val y = 2 { iadd(x, y) } }' assert.deepEqual(expressionToString(expr), expectedExpr) }) + + it('pretty prints match expressions', () => { + const expr = buildExpression('match foo { A => 1 | B(n) => n | _ => 0 }') + const expectedExpr = 'match foo { A(_) => 1 | B(n) => n | _ => 0 }' + assert.deepEqual(expressionToString(expr), expectedExpr) + }) + + it('pretty prints variant expressions', () => { + const intexp: QuintInt = { id: 0n, kind: 'int', value: 1n } + const exprA: QuintVariant = { id: 0n, kind: 'variant', label: 'A', expr: intexp } + assert.deepEqual(expressionToString(exprA), 'A(1)') + const exprB: QuintVariant = { id: 0n, kind: 'variant', label: 'B' } + assert.deepEqual(expressionToString(exprB), 'B') + }) }) describe('typeToString', () => { From f0191d82d116569128d22e1b4cbc59e1130b8993 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 23:25:16 -0400 Subject: [PATCH 10/17] Fix location of expression IR types --- quint/src/quintIr.ts | 48 ++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/quint/src/quintIr.ts b/quint/src/quintIr.ts index 85722f018..6786fcb9f 100644 --- a/quint/src/quintIr.ts +++ b/quint/src/quintIr.ts @@ -248,6 +248,30 @@ export interface QuintLet extends WithId { expr: QuintEx } +export type MatchCase = { + /** the variant label to match */ + label: string + /** the lamba to apply to the variant's wrapped value */ + elim: QuintLambda +} + +export interface QuintMatch extends WithId { + kind: 'match' + /** the variant expression to match */ + expr: QuintEx + /** the cases to match against */ + cases: MatchCase[] +} + +/** A variant value inhabiting a sum type */ +export interface QuintVariant extends WithId { + kind: 'variant' + /** the varian't tag, e.g., the `A` in `A(n)` */ + label: string + /** the expression injected into the sum type */ + expr?: QuintEx +} + /** * Discriminated union of Quint expressions. */ @@ -303,30 +327,6 @@ export interface QuintAssume extends WithId { assumption: QuintEx } -export type MatchCase = { - /** the variant label to match */ - label: string - /** the lamba to apply to the variant's wrapped value */ - elim: QuintLambda -} - -export interface QuintMatch extends WithId { - kind: 'match' - /** the variant expression to match */ - expr: QuintEx - /** the cases to match against */ - cases: MatchCase[] -} - -/** A variant value inhabiting a sum type */ -export interface QuintVariant extends WithId { - kind: 'variant' - /** the varian't tag, e.g., the `A` in `A(n)` */ - label: string - /** the expression injected into the sum type */ - expr?: QuintEx -} - /** QuintTypeDefs represent both type aliases and abstract types * * - Abstract types do not have an associated `type` From 5d2af7811d00ac63cff54c86c11de29b102e2dec Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Fri, 4 Aug 2023 23:35:21 -0400 Subject: [PATCH 11/17] Fix formatting --- quint/src/IRprinting.ts | 2 +- quint/src/flattening.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/IRprinting.ts b/quint/src/IRprinting.ts index eba3cf0d4..ecce2a685 100644 --- a/quint/src/IRprinting.ts +++ b/quint/src/IRprinting.ts @@ -12,7 +12,7 @@ * @module */ -import { OpQualifier, QuintDef, QuintEx, QuintModule, isAnnotatedDef, MatchCase } from './quintIr' +import { MatchCase, OpQualifier, QuintDef, QuintEx, QuintModule, isAnnotatedDef } from './quintIr' import { EmptyRow, QuintSumType, QuintType, Row, RowField, VarRow, isUnitType } from './quintTypes' import { TypeScheme } from './types/base' import { typeSchemeToString } from './types/printing' diff --git a/quint/src/flattening.ts b/quint/src/flattening.ts index 7b4baf73f..ba21ff97d 100644 --- a/quint/src/flattening.ts +++ b/quint/src/flattening.ts @@ -22,11 +22,11 @@ import { QuintExport, QuintImport, QuintInstance, + QuintLambda, QuintModule, QuintOpDef, isAnnotatedDef, isFlat, - QuintLambda, } from './quintIr' import { definitionToString } from './IRprinting' import { ConcreteFixedRow, QuintType, Row } from './quintTypes' From 41d9b6133fa21b077ce1d0f113ded73859ad91ca Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Sat, 5 Aug 2023 00:05:13 -0400 Subject: [PATCH 12/17] Add missing fixtures again --- quint/testFixture/_1044matchExpression.json | 1 + quint/testFixture/_1044matchExpression.map.json | 1 + quint/testFixture/_1044matchExpression.qnt | 11 +++++++++++ 3 files changed, 13 insertions(+) create mode 100644 quint/testFixture/_1044matchExpression.json create mode 100644 quint/testFixture/_1044matchExpression.map.json create mode 100644 quint/testFixture/_1044matchExpression.qnt diff --git a/quint/testFixture/_1044matchExpression.json b/quint/testFixture/_1044matchExpression.json new file mode 100644 index 000000000..4adc0953d --- /dev/null +++ b/quint/testFixture/_1044matchExpression.json @@ -0,0 +1 @@ +{"stage":"parsing","warnings":[],"modules":[{"id":34,"name":"SumTypes","defs":[{"id":4,"name":"T","kind":"typedef","type":{"id":4,"kind":"sum","fields":{"kind":"row","fields":[{"fieldName":"A","fieldType":{"id":1,"kind":"rec","fields":{"kind":"row","fields":[],"other":{"kind":"empty"}}}},{"fieldName":"B","fieldType":{"id":2,"kind":"int"}},{"fieldName":"C","fieldType":{"id":3,"kind":"str"}}],"other":{"kind":"empty"}}}},{"id":8,"kind":"def","name":"A","qualifier":"val","expr":{"id":7,"kind":"lambda","params":[],"qualifier":"val","expr":{"id":6,"kind":"variant","label":"A","expr":{"id":5,"kind":"app","opcode":"Rec","args":[]}}}},{"id":13,"kind":"def","name":"B","qualifier":"def","expr":{"id":12,"kind":"lambda","params":[{"id":9,"name":"__BParam"}],"qualifier":"def","expr":{"id":11,"kind":"variant","label":"B","expr":{"kind":"name","name":"__BParam","id":10}}}},{"id":18,"kind":"def","name":"C","qualifier":"def","expr":{"id":17,"kind":"lambda","params":[{"id":14,"name":"__CParam"}],"qualifier":"def","expr":{"id":16,"kind":"variant","label":"C","expr":{"kind":"name","name":"__CParam","id":15}}}},{"id":21,"kind":"def","name":"c","qualifier":"val","expr":{"id":20,"kind":"app","opcode":"C","args":[{"id":19,"kind":"str","value":"Foo"}]}},{"id":33,"kind":"def","name":"ex","qualifier":"val","expr":{"id":27,"kind":"match","expr":{"id":22,"kind":"name","name":"c"},"cases":[{"label":"A","elim":{"id":28,"kind":"lambda","qualifier":"def","expr":{"id":23,"kind":"int","value":0},"params":[{"name":"_","id":29}]}},{"label":"B","elim":{"id":30,"kind":"lambda","qualifier":"def","expr":{"id":24,"kind":"name","name":"n"},"params":[{"name":"n","id":31}]}},{"label":"_","elim":{"id":32,"kind":"lambda","qualifier":"def","expr":{"id":26,"kind":"app","opcode":"iuminus","args":[{"id":25,"kind":"int","value":1}]},"params":[]}}]}}]}],"table":{"10":{"kind":"param","reference":9},"15":{"kind":"param","reference":14},"20":{"kind":"def","reference":18},"22":{"kind":"def","reference":21},"24":{"kind":"param","reference":31}}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.map.json b/quint/testFixture/_1044matchExpression.map.json new file mode 100644 index 000000000..ecc7152ed --- /dev/null +++ b/quint/testFixture/_1044matchExpression.map.json @@ -0,0 +1 @@ +{"sourceIndex":{"0":"mocked_path/testFixture/_1044matchExpression.qnt"},"map":{"1":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"2":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"3":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"4":[0,{"line":1,"col":2,"index":20},{"line":1,"col":29,"index":47}],"5":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"6":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"7":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"8":[0,{"line":1,"col":11,"index":29},{"line":1,"col":11,"index":29}],"9":[0,{"line":1,"col":17,"index":35},{"line":1,"col":19,"index":37}],"10":[0,{"line":1,"col":15,"index":33},{"line":1,"col":15,"index":33}],"11":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"12":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"13":[0,{"line":1,"col":15,"index":33},{"line":1,"col":20,"index":38}],"14":[0,{"line":1,"col":26,"index":44},{"line":1,"col":28,"index":46}],"15":[0,{"line":1,"col":24,"index":42},{"line":1,"col":24,"index":42}],"16":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"17":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"18":[0,{"line":1,"col":24,"index":42},{"line":1,"col":29,"index":47}],"19":[0,{"line":3,"col":12,"index":62},{"line":3,"col":16,"index":66}],"20":[0,{"line":3,"col":10,"index":60},{"line":3,"col":17,"index":67}],"21":[0,{"line":3,"col":2,"index":52},{"line":3,"col":17,"index":67}],"22":[0,{"line":5,"col":17,"index":87},{"line":5,"col":17,"index":87}],"23":[0,{"line":6,"col":14,"index":105},{"line":6,"col":14,"index":105}],"24":[0,{"line":7,"col":14,"index":121},{"line":7,"col":14,"index":121}],"25":[0,{"line":8,"col":15,"index":138},{"line":8,"col":15,"index":138}],"26":[0,{"line":8,"col":14,"index":137},{"line":8,"col":15,"index":138}],"27":[0,{"line":5,"col":11,"index":81},{"line":9,"col":72,"index":142}],"28":[0,{"line":6,"col":6,"index":97},{"line":6,"col":14,"index":105}],"29":[0,{"line":6,"col":6,"index":97},{"line":6,"col":6,"index":97}],"30":[0,{"line":7,"col":6,"index":113},{"line":7,"col":14,"index":121}],"31":[0,{"line":7,"col":6,"index":113},{"line":7,"col":9,"index":116}],"32":[0,{"line":8,"col":6,"index":129},{"line":8,"col":15,"index":138}],"33":[0,{"line":5,"col":2,"index":72},{"line":9,"col":72,"index":142}],"34":[0,{"line":0,"col":0,"index":0},{"line":10,"col":144,"index":144}]}} \ No newline at end of file diff --git a/quint/testFixture/_1044matchExpression.qnt b/quint/testFixture/_1044matchExpression.qnt new file mode 100644 index 000000000..08d848fde --- /dev/null +++ b/quint/testFixture/_1044matchExpression.qnt @@ -0,0 +1,11 @@ +module SumTypes { + type T = A | B(int) | C(str) + + val c = C("Foo") + + val ex = match c { + | A => 0 + | B(n) => n + | _ => -1 + } +} From 9d5c637dd50f84c8bdeffa7f31d13fc5a63fd4b1 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 7 Aug 2023 10:26:48 -0400 Subject: [PATCH 13/17] Update quint/src/generated/Quint.g4 --- quint/src/generated/Quint.g4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/generated/Quint.g4 b/quint/src/generated/Quint.g4 index 2fbdd6a67..64fb6ad4a 100644 --- a/quint/src/generated/Quint.g4 +++ b/quint/src/generated/Quint.g4 @@ -57,7 +57,7 @@ typeDef | 'type' typeName=qualId '=' '|'? typeSumVariant ('|' typeSumVariant)* # typeSumDef ; -// A single variant case in a sum type definition or match statement. +// A single variant case in a sum type definition. // // E.g., `A(t)` or `A`. typeSumVariant : sumLabel=simpleId["variant label"] ('(' type ')')? ; From b8e9b94a498dd2a7ab5efbc491137505eb8f727c Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 7 Aug 2023 10:26:55 -0400 Subject: [PATCH 14/17] Update quint/src/flattening.ts --- quint/src/flattening.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/flattening.ts b/quint/src/flattening.ts index ba21ff97d..71d3280ec 100644 --- a/quint/src/flattening.ts +++ b/quint/src/flattening.ts @@ -373,7 +373,7 @@ class Flatenner { } } - // Gives us a more narrowly typed transformation on lambdsas, so we can use the same functionality for + // Gives us a more narrowly typed transformation on lambdas, so we can use the same functionality for // match exprssions. private addNamespaceToLambda(id: bigint, name: string | undefined, lam: QuintLambda): QuintLambda { return { From 42f995528cdfa76e48b2334fef69ba9352676369 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 7 Aug 2023 10:27:02 -0400 Subject: [PATCH 15/17] Update quint/src/parsing/ToIrListener.ts --- quint/src/parsing/ToIrListener.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index cada165ec..dc5507eb3 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -901,7 +901,7 @@ export class ToIrListener implements QuintListener { // } exitMatchSumExpr(ctx: p.MatchSumExprContext) { const matchId = this.getId(ctx) - // We will have one expression for each match case, plus the + // We will have one expression for each match case, plus the expression we are matching against const exprs = popMany(this.exprStack, ctx._matchCase.length + 1) // The first expression is the one we are matching on // the syntax rules ensure that at least this expression is given From 4c8612fd5602c2211ace676c2d65a2deb72bc1a7 Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 7 Aug 2023 10:27:08 -0400 Subject: [PATCH 16/17] Update quint/src/parsing/ToIrListener.ts --- quint/src/parsing/ToIrListener.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index dc5507eb3..042ae902d 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -903,8 +903,8 @@ export class ToIrListener implements QuintListener { const matchId = this.getId(ctx) // We will have one expression for each match case, plus the expression we are matching against const exprs = popMany(this.exprStack, ctx._matchCase.length + 1) - // The first expression is the one we are matching on - // the syntax rules ensure that at least this expression is given + // The first expression is the one we are matching on. + // The syntax rules ensure that at least this expression is given. const expr = exprs.shift()! // after shifting off the match expr, the remaing exprs are in eache case const cases: MatchCase[] = zip(exprs, ctx._matchCase).map(([caseExpr, caseCtx]) => { From 41db990376e361373443cad28b6e6ad52c02710a Mon Sep 17 00:00:00 2001 From: Shon Feder Date: Mon, 7 Aug 2023 10:27:18 -0400 Subject: [PATCH 17/17] Update quint/src/parsing/ToIrListener.ts --- quint/src/parsing/ToIrListener.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quint/src/parsing/ToIrListener.ts b/quint/src/parsing/ToIrListener.ts index 042ae902d..2897b8049 100644 --- a/quint/src/parsing/ToIrListener.ts +++ b/quint/src/parsing/ToIrListener.ts @@ -906,7 +906,7 @@ export class ToIrListener implements QuintListener { // The first expression is the one we are matching on. // The syntax rules ensure that at least this expression is given. const expr = exprs.shift()! - // after shifting off the match expr, the remaing exprs are in eache case + // after shifting off the match expr, the remaing exprs are must be paired with each case const cases: MatchCase[] = zip(exprs, ctx._matchCase).map(([caseExpr, caseCtx]) => { const caseId = this.getId(caseCtx) let label: string